Aracılığıyla paylaş


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ı ve güvenlikle ilgili olup pipelines görev uzantıları veya hizmet uç noktası uzantılarıyla ilgili değildir. Bu görevler için Azure Service Bus'ta Yayımla Görevini kullanabilirsiniz.

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

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

  • Sağlanan JavaScript REST clientsöğesini kullanıyorsanız kimlik doğrulaması sizin için otomatik olarak işlenir. Bu istemciler çekirdek SDK'dan erişim belirteci ister ve isteğin Yetkilendirme üst bilgisinde ayarlar.

  • Sağlanan istemcileri kullanmıyorsanız, Core SDK'den bir belirteç istemeniz ve isteğinizin Yetkilendirme başlığına ayarlamanız gerekir.

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

Tavsiye

Azure DevOps Uzantı SDK'sını kullanarak uzantı geliştirmeyle ilgili en yeni belgelerimize göz atın.

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

Yaygın bir senaryo, bir uzantıdan arka uç hizmetine çağrı yapmaktır. Bu çağrıların Azure DevOps'ta çalışan uzantınızdan geldiğini doğrulamak ve geçerli kullanıcının ve diğer bağlam bilgilerinin kimliğini doğrulamak için uzantınıza özel bir belirteç türü sağlanır. Bu belirteç, çağıran hakkındaki bilgileri ve isteğin uzantınızdan kaynaklandığından emin olmak için doğrulayabileceğiniz bir imza içerir.

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

Uzantı yayımlandığında oluşturulan uzantınızın benzersiz anahtarı, uzantınızdan yapılan isteklerin orijinalliğini doğrulamak için kullanılabilir.

Bu anahtarı almak için uzantı yönetimi portalına gidin, yayımlanmış bir uzantıya sağ tıklayın ve sertifika'yı seçin.

anahtar

Uyarı

Uzantıdaki kapsam değişiklikleri sertifikanın değişmesine neden olur. Kapsamda değişiklik yaparsanız yeni bir uzantı anahtarına ihtiyacınız vardır.

Hizmetinize sağlamak için bir belirteç oluşturun

  1. Çekirdek SDK getAppToken yöntemi, çözümlendiğinde uzantınızın sertifikasıyla imzalanan bir belirteç içerdiğine dair bir söz döndürür.

    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);
    });
    
  2. Bu belirteci hizmetinize sorgu parametresi veya istek üst bilgisi olarak geçirin.

Belirteci ayrıştır ve doğrula

Burada belirteci ayrıştırma örneği verilmiştir. İlk olarak, yayımcı sayfanızdan uzantınızın gizli dizisini indirin ve depolayın. Bu bilgi uygulamanız için erişilebilir olmalıdır.

.NET Framework

Derlenecek örneği almak için bir başvuru eklemek için aşağıdaki görevi yapın.

NuGet Paket Yöneticisi'ni açın ve System.IdentityModel.Tokens.Jwt öğesine bir başvuru ekleyin. Bu örnek, bu paketin 6.8.0 sürümüyle oluşturulmuştu.

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

Bu örneği derlemek için bir başvuru eklemek için aşağıdaki görevi yapın.

NuGet Paket Yöneticisi'ni açın ve System.IdentityModel.Tokens.Jwt öğesine bir başvuru ekleyin. Bu örnek, bu paketin 5.1.4 sürümüyle oluşturulmuştu.

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

API Denetleyicileriniz:

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

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