Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022
Cet article traite uniquement de l’authentification pour les extensions web . Elle ne s’applique pas aux extensions de tâche de pipeline ou aux extensions de point de terminaison de service.
Conseil / Astuce
Pour obtenir les dernières instructions de développement d’extension, notamment les thèmes et la migration à partir de VSS. Sdk, consultez le portail du kit de développement logiciel (SDK) d’extension Azure DevOps.
Appeler des API REST à partir de votre extension
La plupart des extensions appellent des API REST Azure DevOps pour le compte de l’utilisateur actuel.
Utilisation des clients REST du Kit de développement logiciel (SDK) : l’authentification est gérée automatiquement. Les clients demandent un jeton d’accès à partir du Kit de développement logiciel (SDK) et définissent l’en-tête
Authorization.Utilisation de requêtes HTTP personnalisées : Demandez un jeton à partir du Kit de développement logiciel (SDK) et définissez l’en-tête vous-même :
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 });
Authentifier les demandes auprès de votre service
Lorsque votre extension appelle un service principal que vous contrôlez, vous devez vérifier que la demande provient de votre extension s’exécutant dans Azure DevOps. Le Kit de développement logiciel (SDK) fournit getAppToken(), qui retourne un JWT signé avec le certificat de votre extension. Votre service valide ce jeton pour authentifier la demande.
Obtenir la clé de votre extension
La clé unique de votre extension est générée lors de la publication. Utilisez-la pour vérifier l’authenticité des jetons de votre extension.
- Accédez au portail de gestion des extensions.
- Cliquez avec le bouton droit sur votre extension publiée , puis sélectionnez Certificat.
Avertissement
Les modifications d’étendue entraînent la modification du certificat. Obtenez une nouvelle clé après avoir modifié les périmètres.
Générer un jeton pour votre service
Utilisez cette méthode getAppToken() pour obtenir une signature JWT avec le certificat de votre extension, puis transmettez-la à votre service :
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}`
}
});
});
Valider le jeton
Votre service principal valide le JWT à l’aide de la clé secrète de votre extension. Les exemples suivants montrent comment implémenter la validation.
Important
Ne codez jamais en dur votre secret d’extension dans le code source. Chargez-le à partir de variables d’environnement, d’Azure Key Vault ou d’un autre magasin de configuration sécurisé.
.NET (application de console)
Installez le package NuGet :
dotnet add package System.IdentityModel.Tokens.Jwt
Note
Utilisez la version 7.x ou ultérieure. La version 6.x et les versions antérieures sont déconseillées. Pour plus d’informations, consultez le cycle de vie de la version 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
Installez le package 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();
Contrôleur d’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
}