IdentityServer4 QuckStart 授权与自定义Claims的问题
 更新时间:2020年04月20日 10:25:32   作者:返回主页波多尔斯基  

这篇文章主要介绍了IdentityServer4 QuckStart 授权与自定义Claims的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

最近在折腾IdentityServer4,为了简单,直接使用了官方给的QuickStart示例项目作为基础进行搭建。有一说一,为了保护一个API,感觉花费的时间比写一个API还要多。
本文基于ASP.NET CORE 3.1, IdentityServer4 3.1.3。代码皆为关键代码,贴全了太多了。
好不容易跑起来了,最终的任务要落实到授权的工作上来。在API中使用Authorize用来限制用户的访问。

[Route(“api/[controller]”)]
[Authorize(Roles = “Administrator”)]
[ApiController]
public class UserInfoController : ControllerBase
{
/// <summary>
/// 无参GET请求
/// </summary>
/// <returns></returns>
[HttpGet()]
[ProducesResponseType(typeof(ReturnData<IEnumerable<UserInfo>>), Status200OK)]
public async Task<ActionResult> Get()
{
var info = new Info<UserInfo>();
return Ok(new ReturnData<IEnumerable<UserInfo>>(await info.Get()));
}

然而在使用的时候,虽然正确取得授权,但是却无法正常访问API,一直提示401没有授权错误。仔细检查,发现IdentityServer4返回的内容并没有返回role的JwtClaimTypes,没有它,Authorize无法正常工作。

{
“nbf”: 1587301921,
“exp”: 1587305521,
“iss”: “localhost:5000”,
“aud”: “MonitoringSystemApi”,
“client_id”: “webClient”,
“sub”: “c6c18d4d-c28e-4de5-86dd-779121216204”,
“auth_time”: 1587301921,
“idp”: “local”,
“scope”: [
“roles”,
“MonitoringSystemApi”,
“offline_access”
],
“amr”: [
“pwd”
]
}

实现
查看Config.cs,IdentityServer4默认只返回两种IdentityResource:openid和profile。按照官方的说法,这个东西定义的内容会返回到用户的token。参考。那么就果断给它安排。

public static IEnumerable<IdentityResource> Ids =>
new List<IdentityResource>
{
new IdentityResources.OpenId(),
new IdentityResources.Profile(),
new IdentityResource (“roles”, new List<string> { JwtClaimTypes.Role }){ Required = true}
};

public static IEnumerable<Client> Clients =>
new List<Client>
{
new Client
{
ClientId = “webClient”,
ClientSecrets = { new Secret(“secret”.Sha256()) },
AllowOfflineAccess = true,
AllowedGrantTypes = GrantTypes.ResourceOwnerPassword,
// scopes that client has access to
AllowedScopes = {
“roles”,

“MonitoringSystemApi” }
},

执行之前,需要确保数据库中的用户数据,已经包含role的Claim。

//添加用户代码
bob = new ApplicationUser
{
UserName = “bob”
};
var result = userMgr.CreateAsync(bob, “Pass123$”).Result;
if (!result.Succeeded)
{
throw new Exception(result.Errors.First().Description);
}
result = userMgr.AddClaimsAsync(bob, new Claim[]{
new Claim(JwtClaimTypes.Role, “Administrator”),
new Claim(JwtClaimTypes.Name, “Bob Smith”),

运行程序,返回值依旧没有任何变化,很挫败,只能继续折腾。
有研究通过实现IProfileService达到自定义Cliams。文章写的很详细,我这就不重复了,我实际试验过,可以成功。
但是文章末尾的注意,很重要。
“那么, 通过profileservice颁发的claims, 任意clients都能拿到”
说明这个优先级是非常高的,可以覆盖所有的行为,当然我们可以在IProfileService的实现上对权限进行进一步的设置,不过还是挺麻烦的。参考实现,参考官方
作为懒人,必然不想再费劲去折腾权限的问题,那么是否有简单点的办法呢?
网上有一些问答说到了可以通过设置Scopes来达到目的。不过过于久远,IdentityServer4已经没有这个独立的类了,说是已经被ApiResource取代了。
直觉上这个东西应该是指示要保护的API的相关内容的,好像和这个没啥关系,不过也只能死马当活马医了。修改config.cs,最终如下内容:

public static IEnumerable<ApiResource> Apis =>
new List<ApiResource>
{
new ApiResource(“pls”, new[]{ “role”}),
};

public static IEnumerable<Client> Clients =>
new List<Client>
{
new Client
{
ClientId = “webClient”,
ClientSecrets = { new Secret(“secret”.Sha256()) },
AllowOfflineAccess = true,
AllowedGrantTypes = GrantTypes.ResourceOwnerPassword,
// scopes that client has access to
AllowedScopes = {
“pls”
}
},

返回结果如下:

{
“nbf”: 1587301799,
“exp”: 1587305399,
“iss”: “localhost:5000”,
“aud”: “pls”,
“client_id”: “webClient”,
“sub”: “c6c18d4d-c28e-4de5-86dd-779121216204”,
“auth_time”: 1587301799,
“idp”: “local”,
“role”: “Administrator”,
“scope”: [
“pls”,
“offline_access”
],
“amr”: [
“pwd”
]
}

终于看见心心念念的自定义Claim(role),可以去访问API了。
注意,在Client中也有个Claims,添加了role并且设置AlwaysSendClientClaims和AlwaysIncludeUserClaimsInIdToken之后,会在token中添加client_roie字段,这个是没办法用与授权的,可以理解为IdentityServer4直接指定了Client角色,并不是Identity中的角色概念。
后记
回过头来仔细看官方的文档,ApiResource中的UserClaims就是用来干这个的,折腾了半天,不如当时仔细看看文档了。
到此这篇关于IdentityServer4 QuckStart 授权与自定义Claims的文章就介绍到这了,更多相关IdentityServer4 QuckStart Claims内容请搜索华域联盟以前的文章或继续浏览下面的相关文章希望大家以后多多支持华域联盟!

您可能感兴趣的文章:IdentityServer4实现.Net Core API接口权限认证(快速入门)JPA中EntityListeners注解的使用详解php中html_entity_decode实现HTML实体转义EF(EntityFramework) 插入或更新数据报错的解决方法详解ASP.NET中Identity的身份验证代码c# 使用Entity Framework操作Access数据库的示例Idea自动生成Entity实现过程详解

IdentityServer4
QuckStart
Claims

相关文章
ASP.NET4 GridView的四种排序样式详解Gridview控件拥有很多不同的CSS样式属性设置,包括象CssClass,Font字体,ForeColor,BackColor,BackColor, Width, Height等等,下面为大家介绍下GridView的四种排序样式 2014-08-08
ASP.NET中事件如何依次发生?这篇文章主要介绍了ASP.NET中事件是如何依次发生的, 2015-09-09
asp.net多图片上传实现程序代码下面是一个完整的asp.net同时支持多图片上传一个实现,有需要的朋友可参考一下,本文章限制同时可上传8张图片,当然大可自己可修改更多或更少 2012-09-09
在.NET Core类库中使用EF Core迁移数据库到SQL Server的方法下面小编就为大家分享一篇在.NET Core类库中使用EF Core迁移数据库到SQL Server的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 2017-12-12
asp.net中“从客户端中检测到有潜在危险的Request.Form值”错误的这篇文章主要介绍了asp.net中“从客户端中检测到有潜在危险的Request.Form值”错误的解决办法,需要的朋友可以参考下 2015-11-11
asp.net自动更新组件分享前两天在博客上发布了一篇英文的自动更新组件文章Release a AutoUpdater tool,那么在这篇文章中,我们也对其功能进行一些简单说明,这个组件非常简单,所以大家可以下载进行一些改进。 2010-10-10
基于SignalR的消息推送与二维码扫描登录实现代码这篇文章主要介绍了基于SignalR的消息推送与二维码扫描登录实现代码,需要的朋友可以参考下 2017-02-02
Asp.Net性能优化技巧汇总这篇文章主要介绍了Asp.Net性能优化技巧汇总,非常实用的归纳总结,需要的朋友可以参考下 2014-07-07
ASP.Net中表单POST到其他页面的方法分享这篇文章主要介绍了ASP.Net中表单POST到其他页面的方法,需要的朋友可以参考下 2014-02-02
.net 中的SqlConnection连接池机制详解.net 中通过 SqlConnection 连接 sql server,我们会发现第一次连接时总是很耗时,但后面连接就很快,这个其实和SqlConnection 的连接池机制有关 2013-04-04

最新评论

声明:本站(华域联盟www.cnhackhy.com)所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。