Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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.
- Passare al portale di gestione delle estensioni.
- Fare clic con il pulsante destro del mouse su l'estensione pubblicata e selezionare Certificato.
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
}