IdentityServer4 QuckStart 授权与自定义Claims的问题

2025-05-29 0 43

最近在折腾IdentityServer4,为了简单,直接使用了官方给的QuickStart示例项目作为基础进行搭建。有一说一,为了保护一个API,感觉花费的时间比写一个API还要多。

本文基于ASP.NET CORE 3.1, IdentityServer4 3.1.3。代码皆为关键代码,贴全了太多了。

好不容易跑起来了,最终的任务要落实到授权的工作上来。在API中使用Authorize用来限制用户的访问。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16
[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无法正常工作。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18
{

"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。参考。那么就果断给它安排。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23
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。

?

1

2

3

4

5

6

7

8

9

10

11

12

13
//添加用户代码

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,最终如下内容:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20
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"

}

},

返回结果如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18
{

"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并且设置AlwaysSendClientClaimsAlwaysIncludeUserClaimsInIdToken之后,会在token中添加client_roie字段,这个是没办法用与授权的,可以理解为IdentityServer4直接指定了Client角色,并不是Identity中的角色概念。

后记

回过头来仔细看官方的文档,ApiResource中的UserClaims就是用来干这个的,折腾了半天,不如当时仔细看看文档了。

到此这篇关于IdentityServer4 QuckStart 授权与自定义Claims的文章就介绍到这了,更多相关IdentityServer4 QuckStart Claims内容请搜索快网idc以前的文章或继续浏览下面的相关文章希望大家以后多多支持快网idc!

原文链接:https://www.cnblogs.com/podolski/archive/2020/04/19/12734603.html

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

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

快网idc优惠网 建站教程 IdentityServer4 QuckStart 授权与自定义Claims的问题 https://www.kuaiidc.com/97334.html

相关文章

发表评论
暂无评论