Autentisering och säkerhet
Azure DevOps Services | Azure DevOps Server 2022 – Azure DevOps Server 2019
Den här artikeln gäller endast webbtillägg och inte pipelines-aktivitetstillägg eller tjänstslutpunktstillägg. För dessa uppgifter kan du använda uppgiften Publicera till Azure Service Bus.
Dricks
Läs vår senaste dokumentation om tilläggsutveckling med hjälp av Azure DevOps Extension SDK.
Anropa REST-API:er från ditt tillägg
De flesta tillägg måste anropa Azure DevOps REST API:er för den aktuella användarens räkning.
Om du använder den angivna
JavaScript REST clients
hanteras autentiseringen automatiskt åt dig. Dessa klienter begär automatiskt en åtkomsttoken från kärn-SDK:et och anger den i auktoriseringshuvudet för begäran.Om du inte använder de angivna klienterna måste du begära en token från
Core SDK
och ange den i auktoriseringshuvudet för din begäran: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 }); });
Autentisera begäranden till din tjänst
Ett vanligt scenario är att göra anrop till en serverdelstjänst från ett tillägg. För att verifiera att dessa anrop kommer från ditt tillägg som körs i Azure DevOps och för att verifiera den aktuella användarens äkthet (och annan kontextinformation) görs en särskild typ av token tillgänglig för ditt tillägg. Den här token innehåller information om vem som gör anropet och även en signatur som du kan verifiera för att veta att begäran kom från ditt tillägg.
Hämta tilläggets nyckel
Tilläggets unika nyckel (som genereras när tillägget publiceras) kan användas för att verifiera äktheten hos begäranden som görs från tillägget.
Om du vill hämta den här nyckeln högerklickar du på ett publicerat tillägg och väljer Certifikat.
Varning
Omfångsändringar i ett tillägg gör att certifikatet ändras. Om du gör ändringar i omfånget behöver du en ny tilläggsnyckel.
Generera en token som ska tillhandahållas till din tjänst
Core SDK-metoden
getAppToken
returnerar ett löfte som, när det matchas, innehåller en token signerad med tilläggets certifikat.VSS.getAppToken().then(function(token){ // Add token to your request });
Skicka den här token till din tjänst som en frågeparameter eller begärandehuvud.
Parsa och verifiera token
Här är ett exempel på hur du parsar token. Ladda först ned och lagra hemligheten för tillägget. Du kan hämta detta från utgivarsidan. Den här hemligheten måste vara tillgänglig för ditt program.
.NET Framework
Du måste lägga till en referens för att få det här exemplet att kompilera.
- Öppna NuGet Package Manager och lägg till en referens till System.IdentityModel.Tokens.Jwt. Det här exemplet skapades med version 5.2.2 av det här paketet.
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
Du måste lägga till en referens för att få det här exemplet att kompilera.
- Öppna NuGet Package Manager och lägg till en referens till System.IdentityModel.Tokens.Jwt. Det här exemplet skapades med version 5.1.4 av det här paketet.
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();
}
}
}
Dina API-kontrollanter:
[Route("api/[controller]"),
Authorize()]
public class SampleLogicController : Controller
{
// ...
}