如何使用 IdentityServer4 访问令牌和 [Authorize] 属性

Posted

技术标签:

【中文标题】如何使用 IdentityServer4 访问令牌和 [Authorize] 属性【英文标题】:How to use IdentityServer4 Access Token and [Authorize] attribute 【发布时间】:2019-02-01 20:41:50 【问题描述】:

我有以下项目的解决方案:IdentityServer4ApiServerMvcClient。我使用Hybrid flow。身份验证工作得很好,但我无法在 MvcClient 中获得 role

在 MvсСlient 应用程序中,授权后,我得到access_token。令牌包含必要的声明。但是 MVC 应用程序无法访问用户角色。

也就是说,假设我将从 MVC 应用程序调用外部 API。但我还需要 MVC 应用程序才能使用用户角色。

属性 [Authorize] 工作正常,但 [Authorize(Roles = "admin")] 不起作用!

这里的源代码:gitlab

【问题讨论】:

不提供源代码很难理解问题的原因 好的!这个项目在gitlab 将用户角色添加到您的声明中。 不行 2.1 有一些安全变化,请阅读:leastprivilege.com/2018/07/16/… 【参考方案1】:

不幸的是,我没有找到比拦截 Access Token 事件更好的解决方案。然后我对其进行解析并手动将声明添加到 cookie。

                options.Events = new OpenIdConnectEvents
                
                    OnTokenResponseReceived = xxx =>
                    
                        JwtSecurityTokenHandler handler = new JwtSecurityTokenHandler();
                        JwtSecurityToken jwt = handler.ReadJwtToken(xxx.TokenEndpointResponse.AccessToken);

                        var claimsIdentity = (ClaimsIdentity) xxx.Principal.Identity;
                        claimsIdentity.AddClaims(jwt.Claims);
                        return Task.FromResult(0);
                    
                ;

我会非常感谢你!如果您查看项目的源代码(已更新到 asp.net core 2.1)并提供最佳选择!

【讨论】:

以上是关于如何使用 IdentityServer4 访问令牌和 [Authorize] 属性的主要内容,如果未能解决你的问题,请参考以下文章

如何在 IdentityServer4 中添加自定义声明以访问令牌? [关闭]

如何使用 ClientCredentials grantType 向 IdentityServer4 生成的我的访问令牌添加声明

如何通过方法(不是api)通过identityserver4获取访问令牌?

刷新 IdentityServer4 客户端中的访问令牌

IdentityServer4如何创建身份令牌?

IdentityServer4 如何在授权代码流中存储和更新令牌