Authentifizierung und Sicherheit

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

Dieser Artikel bezieht sich nur auf Weberweiterungen und nicht auf Pipelines-Aufgabenerweiterungen oder Dienstendpunkterweiterungen. Für diese Aufgaben können Sie die Aufgabe "In Azure Service Bus veröffentlichen" verwenden.

Tipp

Sehen Sie sich unsere neueste Dokumentation zur Erweiterungsentwicklung mithilfe des Azure DevOps-Erweiterungs-SDK an.

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 clientsAuthentifizierung verwenden, wird die Authentifizierung automatisch für Sie behandelt. Diese Clients fordern automatisch 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 dem Core SDK anfordern und im Autorisierungsheader Ihrer Anforderung festlegen:

    VSS.require(["VSS/Authentication/Services"],
        function (VSS_Auth_Service) {
            VSS.getAccessToken().then(function(token){
                // Format the auth header
                var authHeader = VSS_Auth_Service.authTokenManager.getAuthorizationHeader(token);
    
                // Add token as an Authorization header to your request
            });
        });
    

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 die Authentizität des aktuellen Benutzers (und andere Kontextinformationen) zu überprüfen, wird eine spezielle Art von Token für Ihre Erweiterung verfügbar gemacht. Dieses Token enthält Informationen darüber, wer den Aufruf durchführt, und eine Signatur, die Sie überprüfen können, um zu wissen, dass die Anforderung von Ihrer Erweiterung stammt.

Abrufen des Schlüssels Ihrer Erweiterung

Der eindeutige Schlüssel Ihrer Erweiterung (der beim Veröffentlichen der Erweiterung generiert wird) kann verwendet werden, um die Echtheit von Anforderungen zu überprüfen, die von Ihrer Erweiterung vorgenommen wurden.

Um diesen Schlüssel zu erhalten, klicken Sie mit der rechten Maustaste auf eine veröffentlichte Erweiterung, und wählen Sie "Zertifikat" aus.

Schlüssel

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

  1. Die Core SDK-Methode getAppToken gibt eine Zusage zurück, die, wenn sie aufgelöst wird, ein Token enthält, das mit dem Zertifikat Ihrer Erweiterung signiert ist.

    VSS.getAppToken().then(function(token){
        // Add token to your request
    });
    
  2. Übergeben Sie dieses Token als Abfrageparameter oder Anforderungsheader an Ihren Dienst.

Analysieren und Überprüfen des Tokens

Hier ist ein Beispiel für die Analyse des Tokens. Laden Sie zuerst das Geheimnis für Ihre Erweiterung herunter und speichern Sie es. Sie können dies von Ihrer Herausgeberseite abrufen. Dieser Geheimschlüssel muss für Ihre Anwendung verfügbar sein.

.NET Framework

Sie müssen 1 Verweis hinzufügen, um dieses Beispiel zum Kompilieren abzurufen.

  1. Öffnen Sie die NuGet-Paket-Manager, und fügen Sie einen Verweis auf System.IdentityModel.Tokens.Jwt hinzu. Dieses Beispiel wurde mit Version 5.2.2 dieses Pakets erstellt.
using System.Collections.Generic;
using System.ServiceModel.Security.Tokens;
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.UTF8Encoding.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);
		}
	}
}

.NET Core - WebAPI

Sie müssen 1 Verweis hinzufügen, um dieses Beispiel zum Kompilieren abzurufen.

  1. Öffnen Sie die NuGet-Paket-Manager, und fügen Sie einen Verweis auf System.IdentityModel.Tokens.Jwt hinzu. 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.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.AddMvc();

            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, IHostingEnvironment env)
        {
            app.UseAuthentication();
            app.UseAuthorization();
            app.UseMvc();
            app.UseStaticFiles();
        }
    }
}

Ihre API-Controller:

[Route("api/[controller]"), 
 Authorize()]
public class SampleLogicController : Controller
{
   // ...
}