Проверка подлинности и безопасность
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, и проверить подлинность текущего пользователя (и другие сведения о контексте), специальный тип маркера становится доступным для расширения. Этот маркер содержит сведения о том, кто выполняет вызов, а также подпись, которую можно проверить, чтобы узнать, что запрос поступил из расширения.
Получение ключа расширения
Уникальный ключ расширения (который создается при публикации расширения) можно использовать для проверки подлинности запросов, сделанных из расширения.
Чтобы получить этот ключ, щелкните правой кнопкой мыши опубликованное расширение и выберите сертификат.
Предупреждение
Изменения области в расширении вызывают изменение сертификата. Если вы вносите изменения в область, вам потребуется новый ключ расширения.
Создание маркера для предоставления службе
Метод Core SDK
getAppToken
возвращает обещание, которое при разрешении содержит маркер, подписанный сертификатом расширения.VSS.getAppToken().then(function(token){ // Add token to your request });
Передайте этот маркер в службу в качестве параметра запроса или заголовка запроса.
Анализ и проверка маркера
Ниже приведен пример анализа маркера. Сначала скачайте и сохраните секрет для расширения. Это можно получить на странице издателя. Этот секрет должен быть доступен приложению.
.NET Framework
Чтобы получить этот пример для компиляции, необходимо добавить 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 ссылку.
- Откройте диспетчер пакетов 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
{
// ...
}