Dela via


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

key

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

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

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

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