我有一个.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)的安全方法是什么?
答案 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")]