Freigeben über


Authentifizieren und Sichern von Weberweiterungen

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

In diesem Artikel wird nur die Authentifizierung für Weberweiterungen behandelt. Sie gilt nicht für Pipelineaufgabenerweiterungen oder Dienstendpunkterweiterungen.

Tipp

Für die neuesten Anleitungen zur Erweiterungsentwicklung, einschließlich Themengestaltung und Migration von VSS.SDK, besuchen Sie das Entwicklerportal des Azure DevOps Extension SDK.

Aufrufen von REST-APIs aus Ihrer Erweiterung

Die meisten Erweiterungen rufen Azure DevOps-REST-APIs im Namen des aktuellen Benutzers auf.

  • Verwenden der SDK-REST-Clients: Die Authentifizierung wird automatisch behandelt. Die Clients fordern ein Zugriffstoken aus dem SDK an und legen den Authorization Header fest.

  • Verwenden von benutzerdefinierten HTTP-Anforderungen: Anfordern eines Tokens aus dem SDK und Festlegen des Headers selbst:

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

Authentifizieren von Anforderungen an Ihren Dienst

Wenn Ihre Erweiterung einen von Ihnen gesteuerten Back-End-Dienst aufruft, müssen Sie überprüfen, ob die Anforderung von Ihrer Erweiterung stammt, die in Azure DevOps ausgeführt wird. Das SDK stellt ein getAppToken()JWT bereit, das mit dem Zertifikat Ihrer Erweiterung signiert ist. Ihr Dienst überprüft dieses Token, um die Anforderung zu authentifizieren.

Holen Sie sich den Schlüssel Ihrer Erweiterung

Der eindeutige Schlüssel Ihrer Erweiterung wird generiert, wenn Sie sie veröffentlichen. Verwenden Sie sie, um die Echtheit von Token aus Ihrer Erweiterung zu überprüfen.

  1. Wechseln Sie zum Erweiterungsverwaltungsportal.
  2. Klicken Sie mit der rechten Maustaste auf Ihre veröffentlichte Erweiterung , und wählen Sie "Zertifikat" aus.

Schlüssel

Warnung

Bereichsänderungen bewirken, dass sich das Zertifikat ändert. Rufen Sie nach dem Ändern von Bereichen einen neuen Schlüssel ab.

Generieren eines Tokens für Ihren Dienst

Verwenden Sie getAppToken(), um ein JWT zu erhalten, das mit dem Zertifikat Ihrer Erweiterung signiert ist, und übergeben Sie es an Ihren Dienst.

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

Überprüfen des Tokens

Ihr Back-End-Dienst überprüft das JWT mithilfe des geheimen Schlüssels Ihrer Erweiterung. Die folgenden Beispiele zeigen, wie Die Validierung implementiert wird.

Von Bedeutung

Codieren Sie niemals Ihren Erweiterungsschlüssel im Quellcode. Laden Sie es aus Umgebungsvariablen, Azure Key Vault oder einem anderen sicheren Konfigurationsspeicher.

.NET (Konsolenanwendung)

Installieren Sie das NuGet-Paket:

dotnet add package System.IdentityModel.Tokens.Jwt

Hinweis

Verwenden Sie Version 7.x oder höher. Version 6.x und frühere Versionen sind veraltet. Details finden Sie unter IdentityModel-Versionslebenszyklus .

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

ASP.NET Core-Web-API

Installieren Sie das NuGet-Paket:

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

API-Controller:

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

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