Dela via


Autentisera och skydda webbtillägg

Azure DevOps Services | Azure DevOps Server 2022 – Azure DevOps Server 2019

Den här artikeln gäller endast autentisering och säkerhet för webbtilläggoch inte Pipelines-aktivitetstillägg eller tjänstslutpunktstillägg. För dessa uppgifter kan du använda Publicera till Azure Service Bus-uppgift.

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 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:

    import * as SDK from "azure-devops-extension-sdk";
    import { getAccessToken } from "azure-devops-extension-sdk";
    
    SDK.init();
    
    getAccessToken().then((token) => {
        // Format the auth header
        const authHeader = `Bearer ${token}`;
    
        // Add token as an Authorization header to your request
        console.log(authHeader);
    });
    

Tips

Läs vår senaste dokumentation om tilläggsutveckling med hjälp av Azure DevOps Extension SDK.

Autentisera begäranden till din tjänst

Ett vanligt scenario är att göra anrop till en backend-tjä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 autentisera den aktuella användaren och annan kontextinformation, tillhandahålls en särskild typ av token till ditt tillägg. Den här token innehåller information om anroparen och en signatur som du kan verifiera för att säkerställa att begäran kommer 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 går du till -tilläggshanteringsportalen, högerklickar på ett publicerat tilläggoch väljer sedan Certificate.

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. Metoden Core SDK getAppToken returnerar ett löfte som, när det löses, innehåller en token signerad med ditt tilläggs certifikat.

    import * as SDK from "azure-devops-extension-sdk";
    import { getAppToken } from "azure-devops-extension-sdk";
    
    SDK.init();
    
    getAppToken().then((token) => {
    // Add token to your request
    console.log(token);
    });
    
  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 från utgivarens sida. Den här hemligheten måste vara tillgänglig för din applikation.

.NET Framework

Gör följande uppgift för att lägga till en referens för att hämta exemplet för kompilering.

Öppna NuGet Package Manager och lägg till en referens till System.IdentityModel.Tokens.Jwt. Det här exemplet skapades med version 6.8.0 av det här paketet.

using System;
using System.IdentityModel.Tokens.Jwt;
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.Encoding.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);
            
            // Use the principal object as needed
            Console.WriteLine(principal.Identity.Name);
        }
    }
}

.NET Core – WebAPI

Gör följande uppgift för att lägga till en referens för att hämta det här exemplet för kompilering.

Ö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.Extensions.DependencyInjection;
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.AddControllers();

            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, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseAuthentication();
            app.UseAuthorization();
            app.UseRouting();
            app.UseStaticFiles();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }
}

DINA API-kontrollanter:

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

[Route("api/[controller]")]
[Authorize]
public class SampleLogicController : ControllerBase
{
   // ...
}