Web uzantılarının kimliğini doğrulama ve güvenliğini sağlama

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

Bu makale yalnızca web uzantıları için kimlik doğrulamasını kapsar. İşlem hattı görev uzantıları veya hizmet uç noktası uzantıları için geçerli değildir.

Tavsiye

En son uzantı geliştirme kılavuzu için, temalandırma ve VSS.SDK'dan geçiş dahil, Azure DevOps Uzantısı SDK geliştirici portalına bakın.

Uzantınızdan REST API'lerini çağırma

Çoğu uzantı, geçerli kullanıcı adına Azure DevOps REST API'lerini çağırır.

  • SDK REST istemcilerini kullanma: Kimlik doğrulaması otomatik olarak işlenir. İstemciler SDK'dan erişim belirteci ister ve Authorization başlığını ayarlar.

  • Özel HTTP isteklerini kullanma: SDK'dan belirteç isteyin ve üst bilgiyi kendiniz ayarlayın:

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

Hizmetinize gelen istekleri kimlik doğrulamasından geçirin.

Uzantınız denetlediğiniz bir arka uç hizmetini çağırdığında, isteğin Azure DevOps'ta çalışan uzantınızdan geldiğini doğrulamanız gerekir. SDK, getAppToken()uzantınızın sertifikasıyla imzalanan bir JWT döndüren sağlar. Hizmetiniz isteğin kimliğini doğrulamak için bu belirteci doğrular.

Uzantınızın anahtarını alma

Uzantınızın benzersiz anahtarı yayımladığınızda oluşturulur. Uzantınızdaki belirteçlerin orijinalliğini doğrulamak için bunu kullanın.

  1. Uzantı yönetimi portalına gidin.
  2. Yayımlanan uzantınıza sağ tıklayın ve Sertifika'ya tıklayın.

anahtar

Uyarı

Kapsam değişiklikleri sertifikanın değişmesine neden olur. Kapsamları değiştirdikten sonra yeni bir anahtar alın.

Hizmetiniz için belirteç oluşturma

Uzantınızın sertifikasıyla imzalanan bir JWT almak ve bunu hizmetinize geçirmek için kullanın getAppToken() :

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

Belirteci doğrula

Arka uç hizmetiniz, uzantınızın gizli dizi anahtarını kullanarak JWT'yi doğrular. Aşağıdaki örneklerde doğrulamanın nasıl uygulanacakları gösterilmektedir.

Önemli

Uzantı gizli dizinizi asla kaynak kodunda sabit kodlamayın. Ortam değişkenlerinden, Azure Key Vault'tan veya başka bir güvenli yapılandırma deposundan yükleyin.

.NET (konsol uygulaması)

NuGet paketini yükleyin:

dotnet add package System.IdentityModel.Tokens.Jwt

Uyarı

7.x veya sonraki bir sürümü kullanın. Sürüm 6.x ve önceki sürümler kullanım dışıdır. Ayrıntılar için bkz. IdentityModel sürüm yaşam döngüsü .

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'si

NuGet paketini yükleyin:

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 Denetleyicisi:

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

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