Webes bővítmények hitelesítése és védelme

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

Ez a cikk csak webes bővítmények hitelesítését ismerteti. Ez nem vonatkozik a folyamatfeladat-bővítményekre vagy a szolgáltatásvégpont-bővítményekre.

Jótanács

A legújabb bővítményfejlesztési útmutatást, beleértve a témázást és a VSS.SDK-ból való migrálást, lásd az Azure DevOps Extension SDK fejlesztői portálját.

REST API-k meghívása a bővítményből

A legtöbb bővítmény meghívja az Azure DevOps REST API-kat az aktuális felhasználó nevében.

  • Az SDK REST-ügyfelek használata: A hitelesítés automatikusan történik. Az ügyfelek hozzáférési jogkivonatot kérnek az SDK-tól, és beállítják a fejlécet Authorization .

  • Egyéni HTTP-kérések használata: Kérjen egy tokent az SDK-tól, és állítsa be önmaga a fejlécet:

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

A szolgáltatáshoz érkező kérések hitelesítése

Amikor a bővítmény egy ön által felügyelt háttérszolgáltatást hív meg, ellenőriznie kell, hogy a kérés az Azure DevOpsban futó bővítményből származik-e. Az SDK getAppToken() használ, amely a bővítmény tanúsítványával aláírt JWT-t ad vissza. A szolgáltatás érvényesíti ezt a tokent a kérés hitelesítéséhez.

A bővítmény kulcsának lekérése

A bővítmény egyedi kulcsa a közzétételkor jön létre. Ezzel ellenőrizheti a bővítmény jogkivonatainak hitelességét.

  1. Nyissa meg a bővítménykezelési portált.
  2. Kattintson a jobb gombbal a közzétett bővítményre , és válassza a Tanúsítvány lehetőséget.

kulcs

Figyelmeztetés

A hatókör módosítása miatt a tanúsítvány megváltozik. Új kulcs lekérése a hatókörök módosítása után.

Token generálása a szolgáltatásodhoz

A getAppToken() használatával szerezze be a saját bővítményének tanúsítványával aláírt JWT-t, majd adja át azt a szolgáltatásnak.

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

A token érvényesítése

A háttérszolgáltatás a bővítmény titkos kulcsával ellenőrzi a JWT-t. Az alábbi példák az ellenőrzés implementálását mutatják be.

Fontos

Soha ne kódolja a bővítmény titkos kódját a forráskódban. Töltse be a környezeti változókból, az Azure Key Vaultból vagy egy másik biztonságos konfigurációs tárból.

.NET (konzolalkalmazás)

Telepítse a NuGet-csomagot:

dotnet add package System.IdentityModel.Tokens.Jwt

Megjegyzés:

Használja a 7.x vagy újabb verziót. A 6.x és korábbi verzió elavult. A részletekért lásd : IdentityModel-verzió életciklusa .

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

Telepítse a NuGet-csomagot:

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-vezérlő:

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

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