【问题标题】:Co-hosting Identity Server 4 with API services using Roles使用角色将 Identity Server 4 与 API 服务共同托管
【发布时间】:2021-02-15 21:35:36
【问题描述】:

我遇到了example,它与需要身份验证和授权的 API 服务在同一应用主机上共同托管 Identity Server 4。

现在我能够通过纯身份验证成功复制它,但是在使用角色进行授权时,我无法让它工作,即在我的控制器操作上添加 [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 成功完成所有这些工作,但需要单独托管。我想看看如何将它们全部托管在一起。

【问题讨论】:

    标签: identityserver4 roles


    【解决方案1】:

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

    当你使用

    services.AddLocalApiAuthentication();
    

    它设置IdentityServerAccessToken authenticationScheme。

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

    [Authorize(IdentityServerConstants.LocalApi.PolicyName)]
    

    如文档中所述,或者只是

    [Authorize(AuthenticationSchemes = "IdentityServerAccessToken")]
    

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

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

    【讨论】:

    • 抱歉回复晚了。谢谢(你的)信息。我不知道可以在 [Authorize] 属性中设置的方案。
    猜你喜欢
    • 2018-02-02
    • 2012-06-24
    • 2021-07-18
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    • 2017-12-07
    • 2018-05-15
    • 2018-12-05
    相关资源
    最近更新 更多