Uwierzytelnianie i zabezpieczenia
Azure DevOps Services | Azure DevOps Server 2022 — Azure DevOps Server 2019
Ten artykuł dotyczy tylko rozszerzeń sieci Web, a nie rozszerzeń zadań potoków lub rozszerzeń punktu końcowego usługi. W przypadku tych zadań można użyć zadania Publikuj w usłudze Azure Service Bus.
Napiwek
Zapoznaj się z naszą najnowszą dokumentacją dotyczącą programowania rozszerzeń przy użyciu zestawu SDK rozszerzenia usługi Azure DevOps.
Wywoływanie interfejsów API REST z rozszerzenia
Większość rozszerzeń wymaga wywołania interfejsów API REST usługi Azure DevOps w imieniu bieżącego użytkownika.
Jeśli używasz podanego
JavaScript REST clients
elementu , uwierzytelnianie jest automatycznie obsługiwane. Ci klienci automatycznie żądają tokenu dostępu z podstawowego zestawu SDK i ustawiają go w nagłówku Autoryzacja żądania.Jeśli nie używasz podanych klientów, musisz zażądać tokenu
Core SDK
z obiektu i ustawić go w nagłówku Autoryzacja żądania: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 }); });
Uwierzytelnianie żądań do usługi
Typowym scenariuszem jest wykonywanie wywołań do usługi zaplecza z rozszerzenia. Aby sprawdzić, czy te wywołania pochodzą z rozszerzenia uruchomionego w usłudze Azure DevOps i zweryfikowania autentyczności bieżącego użytkownika (i innych informacji kontekstowych), dla rozszerzenia zostanie udostępniony specjalny typ tokenu. Ten token zawiera informacje o tym, kto wykonuje wywołanie, a także podpis, który można zweryfikować, aby wiedzieć, że żądanie pochodzi z rozszerzenia.
Uzyskiwanie klucza rozszerzenia
Unikatowy klucz rozszerzenia (generowany podczas publikowania rozszerzenia) może służyć do weryfikowania autentyczności żądań wysyłanych z rozszerzenia.
Aby uzyskać ten klucz, kliknij prawym przyciskiem myszy opublikowane rozszerzenie i wybierz pozycję Certyfikat.
Ostrzeżenie
Zmiany zakresu w rozszerzeniu powodują zmianę certyfikatu. Jeśli wprowadzisz zmiany w zakresie, potrzebujesz nowego klucza rozszerzenia.
Generowanie tokenu w celu udostępnienia usługi
Metoda podstawowego zestawu SDK
getAppToken
zwraca obietnicę, która po rozpoznaniu zawiera token podpisany przy użyciu certyfikatu rozszerzenia.VSS.getAppToken().then(function(token){ // Add token to your request });
Przekaż ten token do usługi jako parametr zapytania lub nagłówek żądania.
Analizowanie i weryfikowanie tokenu
Oto przykład analizowania tokenu. Najpierw pobierz i zapisz wpis tajny dla rozszerzenia. Możesz to uzyskać ze strony wydawcy. Ten wpis tajny musi być dostępny dla aplikacji.
.NET Framework
Aby skompilować ten przykład, musisz dodać 1 odwołanie.
- Otwórz Menedżer pakietów NuGet i dodaj odwołanie do elementu System.IdentityModel.Tokens.Jwt. Ten przykład został skompilowany przy użyciu wersji 5.2.2 tego pakietu.
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
Aby skompilować ten przykład, musisz dodać 1 odwołanie.
- Otwórz Menedżer pakietów NuGet i dodaj odwołanie do elementu System.IdentityModel.Tokens.Jwt. Ten przykład został skompilowany przy użyciu wersji 5.1.4 tego pakietu.
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();
}
}
}
Kontrolery interfejsu API:
[Route("api/[controller]"),
Authorize()]
public class SampleLogicController : Controller
{
// ...
}