首页 > 解决方案 > 使用角色将 Identity Server 4 与 API 服务共同托管

问题描述

我遇到了一个将 Identity Server 4 与需要它进行身份验证和授权的 API 服务共同托管在同一应用程序主机上的示例。

现在我能够通过纯身份验证成功复制它,但是当涉及到使用角色的授权时,我无法让它工作,即 [Authorize(Roles = "My Role")]在我的控制器操作上添加属性。访问令牌包含“角色”范围和声明,但似乎根本没有受到尊重。

我最初尝试了下面的代码,但它根本不执行 JWT Bearer 位,这让我相信 Identity Server 使用它自己的处理程序来达到这个目的,我根本不知道如何配置它。

services.AddAuthentication(options =>
    {
        options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    // JWT tokens (default scheme)
    .AddJwtBearer(options =>
    {
        options.Authority = "https://localhost:44367/";
        options.Audience = "API";

        options.TokenValidationParameters.RoleClaimType = "role";
    });

然后我从示例代码中遇到了这一行(我最初在这篇文章中提到过),这似乎应该授予我与 Identity Server 一起运行 API 服务的能力:

services.AddLocalApiAuthentication();

但它似乎也没有做我想要的。

那么 Identity Server 身份验证中间件是否允许我完成基于角色的身份验证,或者是否有其他一些我需要研究的机制(即策略)?

值得注意的是,我能够使用 Identity Server 4 成功完成所有这些工作,但需要单独托管。我想看看如何将这一切都托管在一起。

标签: identityserver4roles

解决方案


刚刚重新检查了这个例子,它工作得很好。

当你使用

services.AddLocalApiAuthentication();

它设置了IdentityServerAccessTokenauthenticationScheme。

要在 API 控制器中使用它,请键入

[Authorize(IdentityServerConstants.LocalApi.PolicyName)]

如文档中所述,或者只是

[Authorize(AuthenticationSchemes = "IdentityServerAccessToken")]

检查角色所需的只是属性的另一个参数:

[Authorize(AuthenticationSchemes = "IdentityServerAccessToken", Roles = "test role1")]

推荐阅读