Способ, которым я это сделал, - использовать встроенные в Identity Server инструменты для выпуска клиентского JWT и установить его в качестве маркера-носителя для запроса обратно в API.
Я устанавливаю новыйIdentity Client, который содержал определенную область для доступа к API из Identity и использовал этот клиент для самостоятельной выдачи вышеуказанного JWT.Затем в API я создал новую политику авторизации для этой области и применил ее к определенным конечным точкам в API.
Например
В Identity Server Вы можете ввестиIdentityServerTools в ваш класс.Он предварительно зарегистрирован для вас и является частью пространства имен IdentityServer4
public class SomeService : ISomeService
{
private readonly IdentityServerTools _identityServerTools;
public SomeService(IdentityServerTools identityServerTools)
{
_identityServerTools = identityServerTools;
}
private async Task<string> CreateTokenAsync()
{
// Get client for JWT
var idpClient = _dbContext.Clients.FirstOrDefault(c => c.ClientId == SomeClientId);
// Get scopes to set in JWT
var scopes = idpClient.AllowedScopes.Select(s => s.Scope).ToArray();
// Use in-built Identity Server tools to issue JWT
var token = await _identityServerTools.IssueClientJwtAsync(idpClient.ClientId, idpClient.AccessTokenLifetime, scopes, new[] { "Some Api Name"})
}
}
Затем установите этот токен в качестве токена-носителя по вашему запросу.
В вашем API Сейчасчтобы авторизовать этот запрос обратно в настройках вашего API, политику авторизации при запуске
services.AddAuthorization(options =>
{
options.AddPolicy("PolicyName", policy => {
policy.RequireScope("ScopeName")
})
})
, а затем на конечной точке вашего API добавить следующее
[Authorize("PolicyName")]