Partilhar via


Autenticar e proteger extensões da Web

Serviços de DevOps do Azure | Azure DevOps Server | Azure DevOps Server 2022

Este artigo refere-se apenas à autenticação e segurança para extensões da Web, e não extensões de tarefa Pipelines ou extensões de ponto de extremidade de serviço. Para essas tarefas, você pode usar a tarefa Publicar no Barramento de Serviço do Azure.

Chamar APIs REST a partir da sua extensão

A maioria das extensões precisa chamar APIs REST do Azure DevOps em nome do usuário atual.

  • Se você estiver usando o , a autenticação será JavaScript REST clientsprocessada automaticamente para você. Esses clientes solicitam um token de acesso do SDK principal e o definem no cabeçalho Authorization da solicitação.

  • Se você não estiver usando os clientes fornecidos, precisará solicitar um token do Core SDK e defini-lo no cabeçalho Autorização da sua solicitação:

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

Sugestão

Confira nossa documentação mais recente sobre desenvolvimento de extensões usando o SDK de Extensão do Azure DevOps.

Autenticar pedidos ao seu serviço

Um cenário comum é fazer chamadas para um serviço de back-end a partir de uma extensão. Para verificar se essas chamadas são provenientes da sua extensão em execução no Azure DevOps e para autenticar o usuário atual e outras informações de contexto, um tipo especial de token é fornecido à sua extensão. Esse token contém informações sobre o chamador e uma assinatura que você pode validar para garantir que a solicitação tenha origem na sua extensão.

Obtenha a chave da sua extensão

A chave exclusiva da sua extensão, gerada quando a extensão é publicada, pode ser usada para verificar a autenticidade das solicitações feitas a partir da sua extensão.

Para obter essa chave, vá para o portal de gerenciamento de extensão, clique com o botão direito do mouse em uma extensão publicada e selecione Certificado.

chave

Advertência

As alterações de escopo em uma extensão fazem com que o certificado seja alterado. Se você fizer alterações no escopo, precisará de uma nova chave de extensão.

Gere um token para fornecer ao seu serviço

  1. O método Core SDK getAppToken retorna uma promessa que, quando resolvida, contém um token assinado com o certificado da sua extensão.

    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. Passe esse token para o seu serviço como um parâmetro de consulta ou cabeçalho de solicitação.

Analise e valide o token

Aqui está um exemplo de análise do token. Primeiro, transfira e guarde o segredo da sua extensão a partir da página do editor. Este segredo deve estar disponível para a sua aplicação.

.NET Framework

Faça a tarefa a seguir para adicionar uma referência para obter o exemplo para compilar.

Abra o Gerenciador de Pacotes NuGet e adicione uma referência ao System.IdentityModel.Tokens.Jwt. Este exemplo foi criado com a versão 6.8.0 deste pacote.

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 - API Web

Faça a tarefa a seguir para adicionar uma referência para obter este exemplo para compilar.

Abra o Gerenciador de Pacotes NuGet e adicione uma referência ao System.IdentityModel.Tokens.Jwt. Este exemplo foi criado com a versão 5.1.4 deste pacote.

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

Seus controladores de API:

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

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