1

我正在使用 Visual Studio 2015 Enterprise Update 1 和 ASP.NET 5 rc1-final 来构建一个端点,该端点会发出并使用 JWT 令牌,如此所述。在这种方法中,我们有一个“全部完成”的项目——该项目使用 OIDC 发布令牌,使用 JWT 不记名身份验证来验证它们,然后使用 Authorize 属性保护对各种控制器的访问——所有这些都在同一个项目中。

现在我们想通过创建一个发布和验证令牌的 OIDC 授权和身份验证端点来重构此解决方案。然后,我们需要“n”个额外的端点,这些端点依赖于该 OIDC 端点作为认证令牌的中央机构。这将使我们能够在我们不断增长的服务主干上建立额外的端点,而无需将授权和身份验证编码到每个端点中。

虽然我了解如何配置 OIDC 以从一个端点发出令牌,但尚不清楚如何将我的另一个端点指向 OIDC 端点以进行令牌身份验证。目前,JWT 身份验证和 OIDC 在中间件“配置”方法中同时配置,所以我猜也许在所有从属站点上,我会在调用 app.UseJwtBearerAuthentication 时使用一小段代码,只是将 JWT 中间件指向 OIDC 端点?如果是这种情况,app.UseJwtBearerAuthentication 使用 OIDC 来允许 IdentityModel 使用 HTTP 仍然会发生一些神奇的事情,所以我不清楚在从属服务器上是否也需要这个。

任何关于如何建立单个 OIDC 授权和身份验证端点然后让“n”个从属端点指向该端点以对 JWT 令牌进行身份验证的任何建议都将不胜感激。

4

1 回答 1

1

使用 ASOS 绝对可以将资源服务器角色(即 API)与授权服务器角色分开。

When opting for JWT tokens (instead of the default encrypted tokens), you need to ensure the audience is correctly added to the authentication ticket by calling ticket.SetResources, so the JWT access token gets the appropriate audclaim, containing the identifier associated with your resource server (ie 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 端点?如果是这种情况,app.UseJwtBearerAuthentication 使用 OIDC 来允许 IdentityModel 使用 HTTP 仍然会发生一些神奇的事情,所以我不清楚在从属服务器上是否也需要这个。

JWT 不记名中间件通过对配置元数据端点进行 HTTP 调用,options.Authority自动从属性中提到的授权服务器检索用于签署访问令牌的加密密钥:您无需配置任何内容,即使 API 项目是与授权服务器应用程序分开

于 2015-12-25T21:12:47.690 回答