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

时间:2019-05-27 14:15:18

标签: oauth .net-core authorization keycloak

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

在Keycloak中,我为“管理员”用户定义了角色“测试人员”和客户端角色“开发人员”,并具有适当的角色映射。在对Keycloak进行身份验证之后;如果我在jwt.io中查看JWT,则可以看到以下内容:

"realm_access": {
        "roles": [
            "tester"
        ]
    },
    "resource_access": {
        "template": {
            "roles": [
                "developer"
            ]
    },
    ...
},

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

如果我在auth处理程序中设置了一些断点。遇到问题时,我可以在context.user.Claims IEnumerable下看到作为项目列出的“测试人员”和“开发人员”角色,如下所示。

{realm_access: {"roles":["tester"]}}
{resource_access: {"template":{"roles":["developer"]}}}

因此,我应该能够通过验证realm_access集合中的resource_accesscontext.user.Claims的值来成功地在auth处理程序中进行授权,但是这将要求我对声明值进行反序列化,这些声明值似乎只是JSON字符串。

我认为必须有更好的方法,否则我做的事情不正确。

1 个答案:

答案 0 :(得分:0)

“ AspNetCore.Authorization”期望在名为“角色” 的声明(字段)中的角色。并且此声明必须是字符串数组(多值)。您需要在Keycloak端进行一些配置。

第一种选择:

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

转到Keycloak管理控制台>客户端作用域>角色>映射器>客户端角色

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

第二种选择:

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

转到Keycloak管理控制台>客户端作用域>角色>映射器>创建

  • 名称:“根客户端角色”(或您想要的任何内容)
  • 映射器类型:“用户客户端角色”
  • 多值:True
  • 代币声明名称:“角色”
  • 添加访问令牌:True