Delen via


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 clientsgegevens 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.

sleutel

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

  1. 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
    });
    
  2. 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.

  1. 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.

  1. 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
{
   // ...
}