Condividi tramite


Autenticare e proteggere le estensioni Web

Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022

Questo articolo riguarda solo l'autenticazione e la sicurezza per le estensioni Web e non le estensioni dell'attività Pipelines o le estensioni dell'endpoint di servizio. Per queste attività, si può utilizzare l'attività Pubblica nel bus di servizio di Azure.

Chiamare le API REST dall'estensione

La maggior parte delle estensioni deve chiamare le API REST di Azure DevOps per conto dell'utente corrente.

  • Se si utilizza il JavaScript REST clients fornito, l'autenticazione viene gestita automaticamente. Questi client richiedono un token di accesso dall'SDK principale e lo impostano nell'intestazione Authorization della richiesta.

  • Se non si usano i client forniti, è necessario richiedere un token da Core SDK e impostarlo nell'intestazione Autorizzazione della richiesta:

    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);
    });
    

Suggerimento

Vedere la documentazione più recente sullo sviluppo di estensioni con Azure DevOps Extension SDK.

Autenticare le richieste al servizio

Uno scenario comune consiste nell'effettuare chiamate a un servizio back-end da un'estensione. Per verificare che queste chiamate provenano dall'estensione in esecuzione in Azure DevOps e per autenticare l'utente corrente e altre informazioni di contesto, viene fornito un tipo speciale di token all'estensione. Questo token contiene informazioni sul chiamante e una firma che è possibile convalidare per garantire che la richiesta abbia avuto origine dalla tua estensione.

Ottenere la chiave dell'estensione

La chiave univoca dell'estensione, generata quando l'estensione viene pubblicata, può essere usata per verificare l'autenticità delle richieste effettuate dall'estensione.

Per ottenere questa chiave, passare al portale di gestione delle estensioni, fare clic con il pulsante destro del mouse su un'estensione pubblicata e quindi selezionare Certificato.

chiave

Avvertimento

Le modifiche all'ambito in un'estensione comportano un cambiamento del certificato. Se si apportano modifiche all'ambito, è necessaria una nuova chiave di estensione.

Generare un token da fornire al servizio

  1. Il metodo Core SDK getAppToken restituisce una promessa che, se risolta, contiene un token firmato con il certificato dell'estensione.

    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. Passa questo token al tuo servizio come parametro di query o intestazione della richiesta.

Analizzare e convalidare il token

Di seguito è riportato un esempio di analisi del token. Prima di tutto, scaricare e salvare il segreto per l'estensione dalla pagina del publisher. Questo segreto deve essere disponibile per l'applicazione.

.NET Framework

Eseguire l'attività seguente per aggiungere un riferimento per ottenere l'esempio da compilare.

Aprire Gestione pacchetti NuGet e aggiungere un riferimento a System.IdentityModel.Tokens.Jwt. Questo esempio è stato compilato con la versione 6.8.0 di questo pacchetto.

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

Eseguire l'attività seguente per aggiungere un riferimento per ottenere questo esempio da compilare.

Aprire Gestione pacchetti NuGet e aggiungere un riferimento a System.IdentityModel.Tokens.Jwt. Questo esempio è stato compilato con la versione 5.1.4 di questo pacchetto.

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();
            });
        }
    }
}

I tuoi Controller API:

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

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