使用 OpenId Connect 进行基于声明的身份验证

Posted

技术标签:

【中文标题】使用 OpenId Connect 进行基于声明的身份验证【英文标题】:Claims Based Authentication with OpenId Connect 【发布时间】:2016-11-27 13:55:09 【问题描述】:

我正在使用具有 OpenIddict、JWT、资源所有者授予和基于声明的角色的 ASP.NET Core。不执行任何策略的授权按预期工作。

我想对某些控制器和操作方法强制执行授权策略。我所有的用户都有角色声明,所以我在 Startup 中做了以下操作:

services.AddAuthorization(options =>

    options.AddPolicy("Admin", p => p.RequireClaim("Admin");
);

而我对action方法做了如下操作:

[Authorize("Admin")]
public async Task<string> Index()

    return "Yes";

没有“Admin”,我可以访问资源,添加“Admin”后我不能。

我假设是因为我生成的 JWT Token 没有用户声明。

我的 JWT 是否应该包含用户角色声明以使令牌起作用? 如何使用 OpenIddict 发送角色声明?

【问题讨论】:

【参考方案1】:

您需要请求roles 范围,以便将角色复制到访问令牌中(将来可能会更改)。

POST /connect/token HTTP/1.1
Host: server.example.com
Content-Type: application/x-www-form-urlencoded

grant_type=password&username=johndoe&password=A3ddj3w&scope=roles

【讨论】:

我这样做了,它将角色返回给令牌。但后来我不得不修改我的政策以要求角色而不是声明,这不是我的意图,但它现在有效,谢谢。

以上是关于使用 OpenId Connect 进行基于声明的身份验证的主要内容,如果未能解决你的问题,请参考以下文章

OpenID Connect Core 1.0声明(Claims)

使用 OAuth2/OpenId Connect 和微服务进行身份验证和授权

OpenID Connect常见问题

OpenID Connect:如何在客户端凭证流中添加自定义声明数据

OpenID Connect 是什么?

限制来自未知来源的 openid-connect 用户信息请求