我正在使用VisualStudio2015EnterpriseUpdate1和ASP.NET 5Rc1-Final构建一个端点,该端点可以同时处理和使用JWT令牌,详见这里。在这种方法中,我们有一个“全部完成”的项目--该项目使用OIDC来发出令牌,JWT承载身份验证来验证它们,然后使用授权属性保护对各种控制器的访问--所有这些都在同一个项目中。
现在,我们希望通过创建一个只发出和验证令牌的OIDC授权和身份验证端点来重构此解决方案。然后,我们需要“n”附加端点,这些端点依赖于OIDC端点作为验证令牌的中心权限。这将使我们能够在不断增长的服务骨干上建立更多的端点,而不必将授权和身份验证编码到每个端点。
虽然我了解如何将OIDC配置为从一个端点发出令牌,但还不完全清楚如何将另一个端点指向OIDC端点以进行令牌身份验证。目前,JWT身份验证和OIDC是在中间件“配置”方法中同时配置的,所以我猜想,也许在所有的从属站点上,调用app.UseJwtBearerAuthentication时都会有一小部分代码,只需将JWT中间件指向OIDC端点?如果是这样的话,使用OIDC允许IdentityModel使用HTTP的IdentityModel仍然有一些神奇之处,所以我不清楚在从属服务器上是否也需要这样做。
任何关于如何建立单个OIDC授权&身份验证端点,然后将'n‘从属端点指向该端点以便对JWT令牌进行身份验证的建议,都将是非常感谢的。
发布于 2015-12-25 21:12:47
使用ASOS,将资源服务器角色(即API)与授权服务器角色分离无疑是可能的。
当选择JWT令牌(而不是默认的加密令牌)时,需要通过调用ticket.SetResources确保正确地将听众添加到身份验证票证中,因此JWT访问令牌获得适当的aud声明,其中包含与资源服务器关联的标识符(即API):
public override Task GrantResourceOwnerCredentials(GrantResourceOwnerCredentialsContext context) {
var identity = new ClaimsIdentity(context.Options.AuthenticationScheme);
identity.AddClaim(ClaimTypes.NameIdentifier, "[unique identifier]");
var ticket = new AuthenticationTicket(
new ClaimsPrincipal(identity),
new AuthenticationProperties(),
context.Options.AuthenticationScheme);
// Call SetResources with the list of resource servers
// the access token should be issued for.
ticket.SetResources("resource_server_1");
// Call SetScopes with the list of scopes you want to grant.
ticket.SetScopes("profile", "offline_access");
context.Validate(ticket);
return Task.FromResult(0);
} 在您的API应用程序中,您只需使用授权服务器中使用的标识符来设置options.Audience属性,它应该可以工作:
app.UseJwtBearerAuthentication(new JwtBearerOptions {
AutomaticAuthenticate = true,
AutomaticChallenge = true,
Audience = "resource_server_1",
Authority = "http://localhost:61854"
});我在调用app.UseJwtBearerAuthentication时会有一小部分代码--简单地将JWT中间件指向OIDC端点?如果是这样的话,使用OIDC允许IdentityModel使用HTTP的IdentityModel仍然有一些神奇之处,所以我不清楚在从属服务器上是否也需要这样做。
JWT承载中间件自动检索用于从options.Authority属性通过对配置元数据端点进行HTTP调用中提到的授权服务器中签名访问令牌的加密密钥:您不必配置任何东西,即使项目与授权服务器应用程序分离。
https://stackoverflow.com/questions/34401323
复制相似问题