使用角色与 API 服务共同托管 Identity Server 4

Co-hosting Identity Server 4 with API services using Roles

我遇到过 example 在同一应用程序主机上共同托管 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";
    });

然后我从示例代码中看到了这一行(我最初在 post 中提到过)这似乎应该让我能够 运行 API 服务身份服务器方面:

services.AddLocalApiAuthentication();

但它似乎也没有达到我的要求。

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

值得注意的是,我能够使用 Identity Server 4 成功完成所有这些,但是通过单独托管它们。我想看看如何将它们一起托管。

刚刚重新检查了 example,它工作得很好。

当你使用

services.AddLocalApiAuthentication();

它设置 IdentityServerAccessToken 身份验证方案。

要在您的 API 控制器中使用它,您输入

[Authorize(IdentityServerConstants.LocalApi.PolicyName)]

如文档中所述,或者只是

[Authorize(AuthenticationSchemes = "IdentityServerAccessToken")]

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

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