使用 Keycloak 和 .NET 核心的基于角色的授权

Rya*_*sch 4 authorization oauth keycloak .net-core

dotnet core 2.2.3 和 Keycloak 4.5.0 基于角色的授权存在一些小问题。

在 Keycloak 中,我定义了一个“tester”角色和一个客户端角色“developer”,并为“admin”用户定义了适当的角色映射。在对 Keycloak 进行身份验证后;如果我查看 jwt.io 中的 JWT,我可以看到以下内容:

{
  "realm_access": {
    "roles": [
      "tester"
    ]
  },
  "resource_access": {
    "template": {
      "roles": [
        "developer"
      ]
    },
    ...
  },
  ...
}
Run Code Online (Sandbox Code Playgroud)

在 .NET 核心中,我尝试了很多事情,例如添加[Authorize(Roles = "tester")][Authorize(Roles = "developer")]到我的控制器方法以及使用基于策略的授权,我context.User.IsInRole("tester")在其中检查我的AuthorizationHandler<TRequirement>实现。

如果我在身份验证处理程序中设置了一些断点。当它被击中时,我可以看到“tester”和“developer”角色列为context.user.ClaimsIEnumerable下的项目,如下所示。

{realm_access: {"roles":["tester"]}}
{resource_access: {"template":{"roles":["developer"]}}}
Run Code Online (Sandbox Code Playgroud)

所以,我应该能够被用于验证值做成功的AUTH处理器的授权realm_accessresource_accesscontext.user.Claims集,但这需要我反序列化要求值,这只是似乎是JSON字符串。

我在想必须有更好的方法,或者我没有做对的事情。

den*_*maz 10

"AspNetCore.Authorization" 需要名为"roles"的声明(字段)中的角色。而且这个声明必须是一个字符串数组(多值)。您需要在 Keycloak 端进行一些配置。

第一种选择:

您可以更改现有角色路径。

转到您的 Keycloak 管理控制台 > 客户端范围 > 角色 > 映射器 > 客户端角色

  • 将“令牌声明名称”更改为“角色”
  • 多值:真
  • 添加到访问令牌:True

第二种选择:

如果您不想触及现有路径,您可以创建一个新的 Mapper 以在根目录中也显示相同的角色。

转到您的 Keycloak 管理控制台 > 客户端范围 > 角色 > 映射器 > 创建

  • 名称:“root 客户端角色”(或任何你想要的)
  • 映射器类型:“用户客户端角色”
  • 多值:真
  • 令牌声明名称:“角色”
  • 添加到访问令牌:True

  • **第三种选择:** 在这里查看我的答案:/sf/answers/3767203611/ (5认同)
  • 令牌声明名称必须是“角色”*而不是*“角色” (4认同)