Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022
Dieser Artikel bezieht sich nur auf die Authentifizierung und Sicherheit für Weberweiterungen und nicht auf Pipelines-Aufgabenerweiterungen oder Dienstendpunkterweiterungen. Für diese Aufgaben können Sie die Aufgabe " In Azure Service Bus veröffentlichen" verwenden.
Aufrufen von REST-APIs aus Ihrer Erweiterung
Die meisten Erweiterungen müssen Azure DevOps-REST-APIs im Namen des aktuellen Benutzers aufrufen.
Wenn Sie die bereitgestellte
JavaScript REST clientsverwenden, wird die Authentifizierung automatisch für Sie durchgeführt. Diese Clients fordern ein Zugriffstoken aus dem Kern-SDK an und legen es im Autorisierungsheader der Anforderung fest.Wenn Sie die bereitgestellten Clients nicht verwenden, müssen Sie ein Token von
Core SDKanfordern und es im Autorisierungsheader Ihrer Anforderung festlegen.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); });
Tipp
Sehen Sie sich unsere neueste Dokumentation zur Erweiterungsentwicklung mit dem Azure DevOps Extension SDK an.
Authentifizieren von Anforderungen an Ihren Dienst
Ein häufiges Szenario besteht darin, Aufrufe an einen Back-End-Dienst von einer Erweiterung aus zu tätigen. Um zu überprüfen, ob diese Aufrufe von Ihrer Erweiterung stammen, die in Azure DevOps ausgeführt wird, und um den aktuellen Benutzer und andere Kontextinformationen zu authentifizieren, wird Ihrer Erweiterung ein spezieller Tokentyp bereitgestellt. Dieses Token enthält Informationen über den Aufrufer und eine Signatur, die Sie überprüfen können, um sicherzustellen, dass die Anforderung von Ihrer Erweiterung stammt.
Holen Sie sich den Schlüssel Ihrer Erweiterung
Der eindeutige Schlüssel Ihrer Erweiterung, der beim Veröffentlichen der Erweiterung generiert wird, kann verwendet werden, um die Authentizität von Anforderungen zu überprüfen, die von Ihrer Erweiterung vorgenommen wurden.
Um diesen Schlüssel zu erhalten, wechseln Sie zum Erweiterungsverwaltungsportal, klicken Sie mit der rechten Maustaste auf eine veröffentlichte Erweiterung, und wählen Sie dann "Zertifikat" aus.
Warnung
Bereichsänderungen in einer Erweiterung führen dazu, dass sich das Zertifikat ändert. Wenn Sie Änderungen am Bereich vornehmen, benötigen Sie einen neuen Erweiterungsschlüssel.
Generieren eines Tokens, das Für Ihren Dienst bereitgestellt werden soll
Die Core SDK-Methode
getAppTokengibt eine Zusage zurück, die, wenn sie aufgelöst wird, ein Token enthält, das mit dem Zertifikat Ihrer Erweiterung signiert ist.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); });Übergeben Sie dieses Token als Abfrageparameter oder Anforderungsheader an Ihren Dienst.
Analysieren und Überprüfen des Tokens
Hier ist ein Beispiel für die Syntaxanalyse des Tokens. Laden Sie zuerst den geheimen Schlüssel für Ihre Erweiterung von Ihrer Herausgeberseite herunter, und speichern Sie es. Dieser Geheimschlüssel muss für Ihre Anwendung verfügbar sein.
.NET Framework
Führen Sie die folgende Aufgabe aus, um einen Verweis hinzuzufügen, um das zu kompilierende Beispiel abzurufen.
Öffnen Sie den NuGet-Paket-Manager, und fügen Sie einen Verweis auf System.IdentityModel.Tokens.Jwt. Dieses Beispiel wurde mit Version 6.8.0 dieses Pakets erstellt.
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
Führen Sie die folgende Aufgabe aus, um einen Verweis hinzuzufügen, um dieses Beispiel zum Kompilieren abzurufen.
Öffnen Sie den NuGet-Paket-Manager, und fügen Sie einen Verweis auf System.IdentityModel.Tokens.Jwt. Dieses Beispiel wurde mit Version 5.1.4 dieses Pakets erstellt.
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();
});
}
}
}
Ihre API-Controller:
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
[Route("api/[controller]")]
[Authorize]
public class SampleLogicController : ControllerBase
{
// ...
}