扩展Identity Server 4功能

时间:2018-12-05 01:39:38

标签: c# asp.net-web-api .net-core identityserver4

我有一个.Net-Core项目,该项目使用Identity Server 4作为令牌服务器。目前,我已经设置了身份服务器4来通过Coinbase处理一些付款。我想将一些信息从IdentityServer发回我的api。

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上,我将所需的数据存储在数据库中,但是我在确定如何验证此请求方面遇到了麻烦。

通常,当您要验证应用程序时,将使用身份服务器之类的东西,而过分使用另一台令牌服务器来验证我的令牌服务器,就显得过头了。

验证请求是否来自我的令牌服务器(身份服务器4)的安全方法是什么?

1 个答案:

答案 0 :(得分:1)

我执行此操作的方法是使用Identity Server的内置工具来发布客户端JWT,并将其设置为返回给API的请求的承载令牌。

我设置了一个新的Identity Client,其中包含用于从Identity访问API的特定范围,并使用该客户端自行发行了上述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设置中重新授权此请求,请在Startup上使用授权策略

services.AddAuthorization(options => 
{
   options.AddPolicy("PolicyName", policy => {
    policy.RequireScope("ScopeName")
   })
})

然后在API的端点上添加以下内容

[Authorize("PolicyName")]