【问题标题】:IdentityServer4 Role Based Authorization for ASP.NET Core Identity = Access DeniedIdentityServer4 基于角色的 ASP.NET Core 身份授权 = 拒绝访问
【发布时间】:2023-03-21 04:23:01
【问题描述】:

我有一个使用 IdentityServer4 作为登录服务器的 ASP.NET Core 客户端应用程序。客户端可以登录使用属性[Authorize] 装饰控制器,但如果我使用带有角色[Authorize(Roles = "test")] 的属性,我会得到一个Access-Denied

但是,当我解析 JWT 时,我可以看到用户分配了正确的角色。

{
  "nbf": xxx,
  "exp": xxx,
  "iss": "xxx",
  "aud": [
    "xxx",
    "xxx"
  ],
  "client_id": "xxx",
  "sub": "xxx",
  "auth_time": xxx,
  "idp": "xxx",
  "email": "xxx",
  "role": "test", <-------------------------------
  "scope": [
    "openid",
    "profile",
    "xxx",
    "xxx"
  ],
  "amr": [
    "xxx"
  ]
}

【问题讨论】:

  • 可能会显示一个带有声明的示例用户,当您使用快速入门时,您可能会拥有配置。您是否定义了任何策略?不妨看看 PolicyServer.Local,它非常轻量级,但也是实现角色的一种简单有效的方式。
  • @SergSam 策略是一个高级步骤。首先,OP 必须确保他在 Web 应用程序中的身份在其中携带角色。

标签: c# jwt identityserver4 access-token asp.net-core-2.1


【解决方案1】:

请确保您附加了正确的 jwt。您提供的那个看起来不错,但可能您附加了请求具有不同有效负载的 id_token。

【讨论】:

  • 好吧,一旦客户端登录它应该自动正确的jwt。
  • oidc 一次引入两个令牌:id_token 包含用户会话,不应发送到外部,以及访问令牌,或者只是令牌是旨在附加到 api 调用的更安全的令牌
  • 我知道 API 的 jwt,但是客户端应用程序如何使用带有角色的令牌?
  • 所以在这种情况下,您可能会遇到相反的情况 - 当您的 Web 应用程序在内部使用 id_token 时,您的角色仅在访问令牌中,在这种情况下,您必须将角色声明添加到您的 IdentityResourses ,而不是ApiResources
  • 比较你的 IdentityResources 和 ApiResources 定义,它们都必须包含角色——最好的例子是官方文档。请参阅有关如何配置 docs.identityserver.io/en/latest/topics/resources.html 的文档
【解决方案2】:

即使用户角色存在于访问令牌中,它也不会被识别为角色,因为它是用户声明的一部分。 例如User.IsInRole("test") 返回 false。

我通过创建一个使用RequireClaim 的策略然后设置Authorize 属性来使用该策略解决了这个问题,例如[Authorize(Policy = "RequireUserOnly")]

【讨论】:

  • 这不是正确的解决方案。为了让系统按设计运行,您必须通过在 IdSrv 端配置“IdentityResourses”或在“OpenIdConnectEvents.OnTokenValidated”委托中手动构建内部客户端的身份票证,将您的角色包含到身份令牌中
猜你喜欢
  • 1970-01-01
  • 2019-05-27
  • 2012-11-12
  • 2017-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-29
  • 2018-09-06
相关资源
最近更新 更多