最近在折腾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": "http://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": "http://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就是用来干这个的,折腾了半天,不如当时仔细看看文档了。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 古典吉他《鲁特琴-BachInspirations巴赫灵感》ThibautGarcia[24Bit/96kHz]
- 刘纬武《睡眠音乐家 缓解疼痛 赫兹白噪音》[320K/MP3][217.2MB]
- 刘纬武《睡眠音乐家 缓解疼痛 赫兹白噪音》[FLAC/分轨][870.69MB]
- 群星1998 《宝丽金最佳电视主题曲》香港首版[WAV+CUE][1.2G]
- 群星1990《群星会·金曲重现》新加坡版[WAV+CUE][1.1G]
- 张惠妹2003《勇敢》[WAV+CUE][1.1G]
- 群星1995《摇滚中国乐势力》首版引进版[WAV+CUE][983M]
- 陈思安《32首酒廊情调》2CD新雅(国际)影碟[WAV+CUE]
- 齐豫潘越云《回声》K2HD[正版原抓WAV+CUE]
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]