Проверка подлинности и безопасность

Azure DevOps Services | Azure DevOps Server 2022 — Azure DevOps Server 2019

Эта статья относится только к веб-расширениям, а не к расширениям задач Pipelines или расширениям конечных точек службы. Для этих задач можно использовать публикацию для Служебная шина Azure задачи.

Совет

Ознакомьтесь с нашей новой документацией по разработке расширений с помощью пакета SDK для расширений Azure DevOps.

Вызов ИНТЕРФЕЙСов REST API из расширения

Большинство расширений должны вызывать REST API Azure DevOps от имени текущего пользователя.

  • Если вы используете указанный JavaScript REST clientsпараметр, проверка подлинности автоматически обрабатывается. Эти клиенты автоматически запрашивают маркер доступа из основного пакета SDK и задают его в заголовке авторизации запроса.

  • Если вы не используете предоставленные клиенты, необходимо запросить маркер из Core SDK и задать его в заголовке авторизации запроса:

    VSS.require(["VSS/Authentication/Services"],
        function (VSS_Auth_Service) {
            VSS.getAccessToken().then(function(token){
                // Format the auth header
                var authHeader = VSS_Auth_Service.authTokenManager.getAuthorizationHeader(token);
    
                // Add token as an Authorization header to your request
            });
        });
    

Проверка подлинности запросов к службе

Распространенный сценарий — это вызовы к внутренней службе из расширения. Чтобы проверить, происходит ли эти вызовы из расширения, работающего в Azure DevOps, и проверить подлинность текущего пользователя (и другие сведения о контексте), специальный тип маркера становится доступным для расширения. Этот маркер содержит сведения о том, кто выполняет вызов, а также подпись, которую можно проверить, чтобы узнать, что запрос поступил из расширения.

Получение ключа расширения

Уникальный ключ расширения (который создается при публикации расширения) можно использовать для проверки подлинности запросов, сделанных из расширения.

Чтобы получить этот ключ, щелкните правой кнопкой мыши опубликованное расширение и выберите сертификат.

key

Предупреждение

Изменения области в расширении вызывают изменение сертификата. Если вы вносите изменения в область, вам потребуется новый ключ расширения.

Создание маркера для предоставления службе

  1. Метод Core SDK getAppToken возвращает обещание, которое при разрешении содержит маркер, подписанный сертификатом расширения.

    VSS.getAppToken().then(function(token){
        // Add token to your request
    });
    
  2. Передайте этот маркер в службу в качестве параметра запроса или заголовка запроса.

Анализ и проверка маркера

Ниже приведен пример анализа маркера. Сначала скачайте и сохраните секрет для расширения. Это можно получить на странице издателя. Этот секрет должен быть доступен приложению.

.NET Framework

Чтобы получить этот пример для компиляции, необходимо добавить 1 ссылку.

  1. Откройте диспетчер пакетов NuGet и добавьте ссылку на System.IdentityModel.Token.Jwt. Этот пример был создан с версией 5.2.2 этого пакета.
using System.Collections.Generic;
using System.ServiceModel.Security.Tokens;
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.UTF8Encoding.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);
		}
	}
}

.NET Core — WebAPI

Чтобы получить этот пример для компиляции, необходимо добавить 1 ссылку.

  1. Откройте диспетчер пакетов NuGet и добавьте ссылку на System.IdentityModel.Token.Jwt. Этот пример был создан с версией 5.1.4 этого пакета.

Startup.cs

using System.Text;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
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.AddMvc();

            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, IHostingEnvironment env)
        {
            app.UseAuthentication();
            app.UseAuthorization();
            app.UseMvc();
            app.UseStaticFiles();
        }
    }
}

Контроллеры API:

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