Расширение функциональности Identity Server 4 - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть проект .Net-Core, который использует Identity Server 4 в качестве токен-сервера.В настоящее время я настроил Identity Server 4 для обработки некоторых платежей через Coinbase.Я хотел бы опубликовать некоторую информацию обратно в мой API от IdentityServer.

public async Task<IActionResult> AuthorizeTransaction(AuthorizeTransaction transactionInfo)
{
    transactionInfo.Transaction.Type = "send";

    try
    {
        var resp = await this._coinbaseOAuthClient
                        .WithHeader("CB-2FA-TOKEN", transactionInfo.TwoFactorCode)
                                .Transactions
                                     .SendMoneyAsync(transactionInfo.AccountId, transactionInfo.Transaction);

        this.PostBackTransactionData(resp.Data)
    }
    catch
    {
        return View("CreateTransaction", transactionInfo);
    }

    return RedirectToAction("index");
}

protected void PostBackTransactionData(Transaction data)
{
    //TODO: Inject api from DI
    var confirmTransactionEndpoint = "https://localhost:44377/api/transactions/confirm-payment";
    var client = new FlurlClient();

    confirmTransactionEndpoint.WithClient(client).PostJsonAsync(data);           
}

На моем API я храню нужные мне данные в своей базе данных, однако у меня возникают проблемы с выяснением, как я могу аутентифицировать этоrequest.

Обычно, когда вы хотите проверить приложение, вы используете что-то вроде Identity server, лишнее наличие другого токен-сервера для проверки моего токен-сервера.

Что такое безопасный способ проверки того, что запрос пришел с моего токен-сервера (Identity Server 4)?

1 Ответ

0 голосов
/ 05 декабря 2018

Способ, которым я это сделал, - использовать встроенные в 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")]
...