Verificatie en beveiliging
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
Dit artikel heeft alleen betrekking op webextensies en niet op pijplijntaakextensies of service-eindpuntextensies. Voor deze taken kunt u de taak Publiceren naar Azure Service Bus gebruiken.
Tip
Bekijk onze nieuwste documentatie over uitbreidingsontwikkeling met behulp van de Azure DevOps Extension SDK.
REST API's aanroepen vanuit uw extensie
De meeste extensies moeten Azure DevOps REST API's aanroepen namens de huidige gebruiker.
Als u de opgegeven
JavaScript REST clients
gegevens gebruikt, wordt verificatie automatisch voor u verwerkt. Deze clients vragen automatisch een toegangstoken aan bij de kern-SDK en stellen dit in de autorisatieheader van de aanvraag in.Als u de opgegeven clients niet gebruikt, moet u een token aanvragen bij de
Core SDK
client en dit instellen in de autorisatieheader van uw aanvraag: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 }); });
Aanvragen verifiëren bij uw service
Een veelvoorkomend scenario is het aanroepen van een back-endservice vanuit een extensie. Om te controleren of deze aanroepen afkomstig zijn van uw extensie die wordt uitgevoerd in Azure DevOps en om de echtheid van de huidige gebruiker (en andere contextgegevens) te controleren, wordt er een speciaal type token beschikbaar gesteld voor uw extensie. Dit token bevat informatie over wie de oproep doet en ook een handtekening die u kunt valideren om te weten dat de aanvraag afkomstig is van uw extensie.
De sleutel van uw extensie ophalen
De unieke sleutel van uw extensie (die wordt gegenereerd wanneer de extensie wordt gepubliceerd) kan worden gebruikt om de echtheid van aanvragen van uw extensie te verifiëren.
Als u deze sleutel wilt ophalen, klikt u met de rechtermuisknop op een gepubliceerde extensie en selecteert u Certificaat.
Waarschuwing
Als het bereik wordt gewijzigd in een extensie, wordt het certificaat gewijzigd. Als u wijzigingen aanbrengt in het bereik, hebt u een nieuwe extensiesleutel nodig.
Een token genereren dat u aan uw service wilt leveren
De Core SDK-methode
getAppToken
retourneert een belofte die, indien opgelost, een token bevat dat is ondertekend met het certificaat van uw extensie.VSS.getAppToken().then(function(token){ // Add token to your request });
Geef dit token door aan uw service als queryparameter of aanvraagheader.
Het token parseren en valideren
Hier volgt een voorbeeld van het parseren van het token. Download en sla eerst het geheim voor uw extensie op. U kunt dit ophalen op uw uitgeverspagina. Dit geheim moet beschikbaar zijn voor uw toepassing.
.NET Framework
U moet 1 verwijzing toevoegen om dit voorbeeld te kunnen compileren.
- Open de NuGet-Pakketbeheer en voeg een verwijzing toe naar System.IdentityModel.Tokens.Jwt. Dit voorbeeld is gemaakt met versie 5.2.2 van dit pakket.
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
U moet 1 verwijzing toevoegen om dit voorbeeld te kunnen compileren.
- Open de NuGet-Pakketbeheer en voeg een verwijzing toe naar System.IdentityModel.Tokens.Jwt. Dit voorbeeld is gemaakt met versie 5.1.4 van dit pakket.
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();
}
}
}
Uw API-controllers:
[Route("api/[controller]"),
Authorize()]
public class SampleLogicController : Controller
{
// ...
}