Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Сервисы Azure DevOps | Azure DevOps Server | Azure DevOps Server 2022
В этой статье рассматривается проверка подлинности только для веб-расширений . Он не применяется к расширениям задач конвейера или расширениям конечной точки службы.
Подсказка
Для получения последних рекомендаций по разработке расширений, включая оформление и миграцию из VSS.SDK, см. на портале разработчика Azure DevOps Extension SDK.
Вызов REST API из расширения
Большинство расширений вызывают REST API Azure DevOps от имени текущего пользователя.
Использование клиентов REST SDK: проверка подлинности обрабатывается автоматически. Клиенты запрашивают токен доступа из пакета SDK и устанавливают заголовок
Authorization.Использование пользовательских HTTP-запросов: запросите маркер из пакета SDK и задайте заголовок самостоятельно:
import * as SDK from "azure-devops-extension-sdk"; SDK.init(); SDK.ready().then(async () => { const token = await SDK.getAccessToken(); const authHeader = `Bearer ${token}`; // Use authHeader in your fetch/XMLHttpRequest calls });
Аутентифицируйте запросы к вашему сервису
Когда расширение вызывает серверную службу, которую вы управляете, необходимо проверить, что запрос поступил из расширения, запущенного в Azure DevOps. SDK предоставляет getAppToken(), который возвращает JWT, подписанный сертификатом вашего расширения. Служба проверяет этот маркер для проверки подлинности запроса.
Получение ключа расширения
Уникальный ключ расширения создается при публикации. Используйте его для проверки подлинности токенов из вашего расширения.
- Перейдите на портал управления расширениями.
- Щелкните правой кнопкой мыши опубликованное расширение и выберите сертификат.
Предупреждение
Изменения области вызывают изменение сертификата. Получите новый ключ доступа после изменения областей.
Создайте токен для вашей службы
Используйте getAppToken() для получения подписи JWT с помощью сертификата расширения, а затем передайте его в службу:
import * as SDK from "azure-devops-extension-sdk";
SDK.init();
SDK.ready().then(async () => {
const token = await SDK.getAppToken();
// Pass this token to your backend as a header or query parameter
const response = await fetch("https://your-service.example.com/api/data", {
headers: {
"Authorization": `Bearer ${token}`
}
});
});
Проверка токена
Серверная служба проверяет JWT с помощью секретного ключа расширения. В следующих примерах показано, как реализовать проверку.
Это важно
Никогда не закодируйте секрет расширения в исходном коде. Загрузите его из переменных среды, Azure Key Vault или другого безопасного хранилища конфигурации.
.NET (консольное приложение)
Установите пакет NuGet:
dotnet add package System.IdentityModel.Tokens.Jwt
Замечание
Используйте версию 7.x или более позднюю. Версия 6.x и более ранних версий устарела. Дополнительные сведения см. в разделе "Жизненный цикл версии IdentityModel ".
using System.IdentityModel.Tokens.Jwt;
using Microsoft.IdentityModel.Tokens;
string secret = Environment.GetEnvironmentVariable("EXTENSION_SECRET")
?? throw new InvalidOperationException("EXTENSION_SECRET not configured");
string issuedToken = ""; // Token from the extension request
var validationParameters = new TokenValidationParameters()
{
IssuerSigningKey = new SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes(secret)),
ValidateIssuer = false,
ValidateAudience = false,
ValidateActor = false,
RequireSignedTokens = true,
RequireExpirationTime = true,
ValidateLifetime = true
};
var tokenHandler = new JwtSecurityTokenHandler();
var principal = tokenHandler.ValidateToken(issuedToken, validationParameters, out SecurityToken token);
Веб-API ASP.NET Core
Установите пакет NuGet:
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
Program.cs
using System.Text;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
string secret = builder.Configuration["ExtensionSecret"]
?? throw new InvalidOperationException("ExtensionSecret not configured");
builder.Services
.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters()
{
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secret)),
ValidateIssuer = false,
ValidateAudience = false,
ValidateActor = false,
RequireSignedTokens = true,
RequireExpirationTime = true,
ValidateLifetime = true
};
});
var app = builder.Build();
app.UseAuthentication();
app.UseRouting();
app.UseAuthorization();
app.MapControllers();
app.Run();
Контроллер API:
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
[Route("api/[controller]")]
[Authorize]
public class SampleLogicController : ControllerBase
{
// Requests without a valid token return 401 Unauthorized
}