Condividi tramite


Autenticare e proteggere le estensioni Web

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

Questo articolo illustra solo l'autenticazione per le estensioni Web . Non si applica alle estensioni dell'attività del pipeline o alle estensioni dell'endpoint di servizio.

Suggerimento

Per le linee guida più recenti per lo sviluppo di estensioni, incluse la tematizzazione e la migrazione da VSS.SDK, vedere il portale per sviluppatori di Azure DevOps Extension SDK.

Chiamare le API REST dall'estensione

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

  • Uso dei client REST SDK: l'autenticazione viene gestita automaticamente. I client richiedono un token di accesso dall'SDK e impostano l'intestazione Authorization .

  • Uso di richieste HTTP personalizzate: richiedere un token dall'SDK e impostare l'intestazione manualmente:

    import * as SDK from "azure-devops-extension-sdk";
    
    SDK.init();
    
    SDK.ready().then(async () => {
        const token = await SDK.getAccessToken();
        const authHeader = `Bearer ${token}`;
    
        // Use authHeader in your fetch/XMLHttpRequest calls
    });
    

Autenticare le richieste al servizio

Quando l'estensione chiama un servizio back-end controllato, è necessario verificare che la richiesta provenisse dall'estensione in esecuzione in Azure DevOps. L'SDK fornisce getAppToken(), che restituisce un token JWT firmato con il certificato dell'estensione. Il servizio convalida questo token per autenticare la richiesta.

Ottenere la chiave dell'estensione

La chiave univoca dell'estensione viene generata durante la pubblicazione. Usarlo per verificare l'autenticità dei token dall'estensione.

  1. Passare al portale di gestione delle estensioni.
  2. Fare clic con il pulsante destro del mouse su l'estensione pubblicata e selezionare Certificato.

chiave

Avvertimento

Le modifiche all'ambito causano la modifica del certificato. Ottieni una nuova chiave dopo la modifica degli ambiti.

Generare un token per il servizio

Usare getAppToken() per ottenere un token JWT firmato con il certificato dell'estensione, quindi passarlo al tuo servizio.

import * as SDK from "azure-devops-extension-sdk";

SDK.init();

SDK.ready().then(async () => {
    const token = await SDK.getAppToken();
    
    // Pass this token to your backend as a header or query parameter
    const response = await fetch("https://your-service.example.com/api/data", {
        headers: {
            "Authorization": `Bearer ${token}`
        }
    });
});

Convalidare il token

Il servizio back-end convalida il token JWT usando la chiave privata dell'estensione. Negli esempi seguenti viene illustrato come implementare la convalida.

Importante

Non inserire mai direttamente nel codice la chiave segreta dell'estensione. Caricarlo da variabili di ambiente, Azure Key Vault o da un altro archivio di configurazione sicuro.

.NET (applicazione console)

Installare il pacchetto NuGet:

dotnet add package System.IdentityModel.Tokens.Jwt

Annotazioni

Usare la versione 7.x o successiva. La versione 6.x e le versioni precedenti sono deprecate. Per informazioni dettagliate, vedere Ciclo di vita della versione di IdentityModel .

using System.IdentityModel.Tokens.Jwt;
using Microsoft.IdentityModel.Tokens;

string secret = Environment.GetEnvironmentVariable("EXTENSION_SECRET")
    ?? throw new InvalidOperationException("EXTENSION_SECRET not configured");
string issuedToken = ""; // Token from the extension request

var validationParameters = new TokenValidationParameters()
{
    IssuerSigningKey = new SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes(secret)),
    ValidateIssuer = false,
    ValidateAudience = false,
    ValidateActor = false,
    RequireSignedTokens = true,
    RequireExpirationTime = true,
    ValidateLifetime = true
};

var tokenHandler = new JwtSecurityTokenHandler();
var principal = tokenHandler.ValidateToken(issuedToken, validationParameters, out SecurityToken token);

API Web ASP.NET Core

Installare il pacchetto NuGet:

dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer

Program.cs

using System.Text;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers();

string secret = builder.Configuration["ExtensionSecret"]
    ?? throw new InvalidOperationException("ExtensionSecret not configured");

builder.Services
    .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters()
        {
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secret)),
            ValidateIssuer = false,
            ValidateAudience = false,
            ValidateActor = false,
            RequireSignedTokens = true,
            RequireExpirationTime = true,
            ValidateLifetime = true
        };
    });

var app = builder.Build();

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

app.Run();

Controller API:

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

[Route("api/[controller]")]
[Authorize]
public class SampleLogicController : ControllerBase
{
   // Requests without a valid token return 401 Unauthorized
}