Bagikan melalui


Mengautentikasi dan mengamankan ekstensi web

Layanan Azure DevOps | Azure DevOps Server | Azure DevOps Server 2022

Artikel ini hanya berkaitan dengan autentikasi dan keamanan untuk ekstensi web, dan bukan ekstensi tugas Pipelines atau ekstensi titik akhir layanan. Untuk tugas tersebut, Anda bisa menggunakan Tugas Terbitkan ke Azure Service Bus.

Memanggil REST API dari ekstensi Anda

Sebagian besar ekstensi perlu memanggil REST API Azure DevOps atas nama pengguna saat ini.

  • Jika Anda menggunakan JavaScript REST clients yang telah disediakan, autentikasi diurus otomatis untuk Anda. Klien ini meminta token akses dari SDK inti dan mengaturnya di header Otorisasi permintaan.

  • Jika Anda tidak menggunakan klien yang disediakan, Anda perlu meminta token dari Core SDK dan mengaturnya di header Otorisasi permintaan Anda:

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

Petunjuk / Saran

Lihat dokumentasi terbaru kami tentang pengembangan ekstensi menggunakan Azure DevOps Extension SDK.

Mengautentikasi permintaan ke layanan Anda

Skenario umum adalah melakukan panggilan ke layanan back-end dari ekstensi. Untuk memverifikasi bahwa panggilan ini berasal dari ekstensi Anda yang berjalan di Azure DevOps dan untuk mengautentikasi pengguna saat ini, dan informasi konteks lainnya, jenis token khusus disediakan untuk ekstensi Anda. Token ini berisi informasi tentang pemanggil dan tanda tangan yang dapat Anda validasi untuk memastikan permintaan berasal dari ekstensi Anda.

Dapatkan kunci ekstensi Anda

Kunci unik ekstensi Anda, yang dihasilkan saat ekstensi diterbitkan, dapat digunakan untuk memverifikasi keaslian permintaan yang dibuat dari ekstensi Anda.

Untuk mendapatkan kunci ini, buka portal manajemen ekstensi, klik kanan pada ekstensi yang diterbitkan, lalu pilih Sertifikat.

kunci

Peringatan

Perubahan cakupan dalam ekstensi menyebabkan sertifikat berubah. Jika Anda membuat perubahan pada cakupan, Anda memerlukan kunci ekstensi baru.

Membuat token untuk diberikan ke layanan Anda

  1. Metode Core SDK getAppToken mengembalikan janji bahwa, ketika diselesaikan, berisi token yang ditandatangani dengan sertifikat ekstensi Anda.

    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. Teruskan token ini ke layanan Anda sebagai parameter kueri atau header permintaan.

Mengurai dan memvalidasi token

Berikut ini adalah contoh penguraian token. Pertama, unduh dan simpan rahasia untuk ekstensi Anda dari halaman penerbit Anda. Rahasia ini harus tersedia untuk aplikasi Anda.

.NET Framework

Lakukan tugas berikut untuk menambahkan satu referensi untuk mendapatkan sampel untuk dikompilasi.

Buka Manajer Paket NuGet dan tambahkan referensi ke System.IdentityModel.Tokens.Jwt. Sampel ini dibuat dengan versi 6.8.0 dari paket ini.

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

Lakukan tugas berikut untuk menambahkan satu referensi untuk mendapatkan sampel ini untuk dikompilasi.

Buka Manajer Paket NuGet dan tambahkan referensi ke System.IdentityModel.Tokens.Jwt. Sampel ini dibuat dengan versi 5.1.4 dari paket ini.

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

Pengontrol API Anda:

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

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