Sdílet prostřednictvím


Ověřování a zabezpečení webových rozšíření

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

Tento článek se týká pouze ověřování a zabezpečení webových rozšíření, nikoli rozšíření úloh Pipelines nebo rozšíření koncových bodů služby. U těchto úloh můžete použít úlohu Publikovat do služby Azure Service Bus.

Volání rozhraní REST API z rozšíření

Většina rozšíření musí vyvolávat rozhraní REST API Azure DevOps jménem aktuálního uživatele.

  • Pokud používáte zadanou službu JavaScript REST clients, ověřování se automaticky zpracuje za vás. Tito klienti požadují přístupový token ze základní sady SDK a nastavili ho v hlavičce Autorizace požadavku.

  • Pokud nepoužíváte poskytnuté klienty, musíte si vyžádat token od Core SDK a nastavit ho v autorizační hlavičce svého požadavku:

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

Návod

Projděte si naši nejnovější dokumentaci k vývoji rozšíření pomocí Azure DevOps Extension SDK.

Ověřování požadavků na vaši službu

Běžným scénářem je volání back-endové služby z rozšíření. Pokud chcete ověřit, že tato volání pocházejí z vašeho rozšíření spuštěného v Azure DevOps a k ověření aktuálního uživatele a dalších kontextových informací, poskytne se vašemu rozšíření speciální typ tokenu. Tento token obsahuje informace o volajícím a podpis, který lze ověřit, abyste zajistili, že požadavek pochází z vašeho rozšíření.

Získání klíče rozšíření

Jedinečný klíč vašeho rozšíření vygenerovaný při publikování rozšíření můžete použít k ověření pravosti požadavků provedených z vašeho rozšíření.

Tento klíč získáte tak, že přejdete na portál pro správu rozšíření, kliknete pravým tlačítkem na publikované rozšíření a vyberete Certifikát.

key

Výstraha

Změny rozsahu v rozšíření způsobí, že se certifikát změní. Pokud provedete změny v rozsahu, potřebujete nový klíč rozšíření.

Vygenerujte token k poskytnutí vaší službě

  1. Metoda Core SDK getAppToken vrátí příslib, že při vyřešení obsahuje token podepsaný certifikátem vašeho rozšíření.

    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. Tento token předejte službě jako parametr dotazu nebo hlavičku požadavku.

Parsování a ověření tokenu

Tady je ukázka analýzy tokenu. Nejdřív si stáhněte a uložte tajný kód rozšíření ze stránky vydavatele. Tento tajný klíč musí být dostupný pro vaši aplikaci.

.NET Framework

Proveďte následující úlohu a přidejte jeden odkaz pro získání ukázky ke kompilaci.

Otevřete Správce balíčků NuGet a přidejte odkaz na System.IdentityModel.Tokens.Jwt. Tato ukázka byla vytvořena s verzí 6.8.0 tohoto balíčku.

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

Proveďte následující úlohu a přidejte jeden odkaz pro získání této ukázky ke kompilaci.

Otevřete Správce balíčků NuGet a přidejte odkaz na System.IdentityModel.Tokens.Jwt. Tato ukázka byla vytvořena s verzí 5.1.4 tohoto balíčku.

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

Kontrolery rozhraní API:

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

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