Ověřování a zabezpečení
Azure DevOps Services | Azure DevOps Server 2022 – Azure DevOps Server 2019
Tento článek se týká pouze webových rozšíření, nikoli rozšíření úloh Pipelines nebo rozšíření koncového bodu služby. U těchto úloh můžete použít úlohu Publikovat do služby Azure Service Bus.
Tip
Projděte si nejnovější dokumentaci k vývoji rozšíření pomocí sady SDK rozšíření Azure DevOps.
Volání rozhraní REST API z vašeho rozšíření
Většina rozšíření musí za aktuálního uživatele volat rozhraní REST API Azure DevOps.
Pokud používáte zadanou službu
JavaScript REST clients
, automaticky se za vás zpracuje ověřování. Tito klienti automaticky požadují přístupový token ze základní sady SDK a nastaví ho v autorizační hlavičce požadavku.Pokud nepoužíváte poskytnuté klienty, musíte požádat o token z
Core SDK
autorizační hlavičky požadavku:VSS.require(["VSS/Authentication/Services"], function (VSS_Auth_Service) { VSS.getAccessToken().then(function(token){ // Format the auth header var authHeader = VSS_Auth_Service.authTokenManager.getAuthorizationHeader(token); // Add token as an Authorization header to your request }); });
Ověřování požadavků ve vaší službě
Běžným scénářem je volání back-endové služby z rozšíření. Pokud chcete ověřit, že tato volání pocházejí z vašeho rozšíření spuštěného v Azure DevOps a k ověření pravosti aktuálního uživatele (a dalších kontextových informací), je pro vaše rozšíření zpřístupněn speciální typ tokenu. Tento token obsahuje informace o tom, kdo volá, a také podpis, který můžete ověřit, abyste věděli, že žádost pochází z vašeho rozšíření.
Získání klíče rozšíření
Jedinečný klíč vašeho rozšíření (který se vygeneruje při publikování rozšíření) můžete použít k ověření pravosti požadavků provedených z vašeho rozšíření.
Tento klíč získáte tak, že kliknete pravým tlačítkem na publikované rozšíření a vyberete Certifikát.
Upozorňující
Změny rozsahu v rozšíření způsobí, že se certifikát změní. Pokud v oboru provedete změny, potřebujete nový klíč rozšíření.
Vygenerování tokenu pro poskytování vaší službě
Metoda Core SDK
getAppToken
vrátí příslib, že při vyřešení obsahuje token podepsaný certifikátem vašeho rozšíření.VSS.getAppToken().then(function(token){ // Add token to your request });
Tento token předejte službě jako parametr dotazu nebo hlavičku požadavku.
Parsování a ověření tokenu
Tady je ukázka analýzy tokenu. Nejprve stáhněte a uložte tajný kód pro vaše rozšíření. Můžete to získat ze stránky vydavatele. Tento tajný klíč musí být dostupný pro vaši aplikaci.
.NET Framework
Chcete-li tuto ukázku zkompilovat, musíte přidat 1 odkaz.
- Otevřete Správce balíčků NuGet a přidejte odkaz na System.IdentityModel.Tokens.Jwt. Tato ukázka byla vytvořena s verzí 5.2.2 tohoto balíčku.
using System.Collections.Generic;
using System.ServiceModel.Security.Tokens;
using Microsoft.IdentityModel.Tokens;
namespace TokenSample
{
class Program
{
static void Main(string[] args)
{
string secret = ""; // Load your extension's secret
string issuedToken = ""; // Token you are validating
var validationParameters = new TokenValidationParameters()
{
IssuerSigningKey = new SymmetricSecurityKey(System.Text.UTF8Encoding.UTF8.GetBytes(secret)),
ValidateIssuer = false,
RequireSignedTokens = true,
RequireExpirationTime = true,
ValidateLifetime = true,
ValidateAudience = false,
ValidateActor = false
};
SecurityToken token = null;
var tokenHandler = new JwtSecurityTokenHandler();
var principal = tokenHandler.ValidateToken(issuedToken, validationParameters, out token);
}
}
}
.NET Core – WebAPI
Chcete-li tuto ukázku zkompilovat, musíte přidat 1 odkaz.
- Otevřete Správce balíčků NuGet a přidejte odkaz na System.IdentityModel.Tokens.Jwt. Tato ukázka byla vytvořena s verzí 5.1.4 tohoto balíčku.
Startup.cs
using System.Text;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.IdentityModel.Tokens;
namespace TokenSample.Core.API
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
string _secret = "ey9asfasdmax..<the secret key downloaded from the Azure DevOps Services publisher page>.9faf7eh";
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer((o) =>
{
o.TokenValidationParameters = new TokenValidationParameters()
{
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_secret)),
ValidateIssuer = false,
ValidateAudience = false,
ValidateActor = false,
RequireSignedTokens = true,
RequireExpirationTime = true,
ValidateLifetime = true
};
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseAuthentication();
app.UseAuthorization();
app.UseMvc();
app.UseStaticFiles();
}
}
}
Kontrolery rozhraní API:
[Route("api/[controller]"),
Authorize()]
public class SampleLogicController : Controller
{
// ...
}