如何更改 asp.net core 1 中的令牌响应?

Posted

技术标签:

【中文标题】如何更改 asp.net core 1 中的令牌响应?【英文标题】:How to change token reponse in asp.net core 1? 【发布时间】:2016-08-03 10:30:05 【问题描述】:

我正在使用 JWT 令牌和 OpenIdConnectServer。一切都很好,但我无法在令牌响应中添加自定义属性......结果如下:

 resource": "resource_server_1",
   "token_type": "bearer",
  "access_token": "eyJhb....LSk5PQldEVVFaTllNU",
  "expires_in": "3600"

我想添加一些属性,例如用户名或角色... 我正在尝试通过 AuthenticationProperties 添加,但它不起作用。这是我的代码:

 public override Task GrantResourceOwnerCredentials(GrantResourceOwnerCredentialsContext context)
        
            ClaimsIdentity identity = new ClaimsIdentity(OpenIdConnectServerDefaults.AuthenticationScheme);
            identity.AddClaim(ClaimTypes.Name, "test", "token id_token");
            identity.AddClaim(ClaimTypes.Role, "test", "token id_token");


            var ticket = new AuthenticationTicket(
                new ClaimsPrincipal(identity),
                new AuthenticationProperties(new Dictionary<string, string>
                
                    "username", "test" 
                ),
                context.Options.AuthenticationScheme);

            ticket.SetResources(new[]  "resource_server_1" );


            context.Validated(ticket);

            return Task.FromResult<object>(null);

        

【问题讨论】:

【参考方案1】:

要向令牌响应添加自定义属性,您可以查看另一个 SO 问题:Overriding TokenEndPoint in AspNet.Security.OpenIdConnect.Server

也就是说,这不是我推荐的方法。相反,您应该使用 OpenID Connect 提供的新 id_token 概念,它也支持 ASOS 中的密码流,并允许在授权服务器和客户端应用程序之间共享用户详细信息。

为此,将scope=openid 添加到您的令牌请求中,OIDC 服务器中间件将开始返回一个 JSON Web 令牌,您可以读取该令牌以提取用户名等用户详细信息。请注意,只有指定 id_token 目标的声明才会包含在身份令牌中。阅读这篇 SO 帖子了解更多信息:https://***.com/a/35041102/542757

(在相关说明中,您没有向身份验证票证添加 ClaimTypes.NameIdentifier 声明:这不是合法操作,因为 OIDC 服务器中间件需要唯一的 id 来识别用户)

【讨论】:

感谢您的回答。你能写一些例子吗?我正在尝试为你的链接添加声明***.com/a/35041102/542757,但输出保持不变......=(仅"resource": "resource_server_1", "token_type": "bearer", "access_token": "eydCInHAm...Q", "expires_in": "3600" 您能分享一下您发送的令牌请求吗? 带有测试数据:) grant_type : password, username : test, password : test on /connect/token 那么 scope=openid 参数在哪里? :P 添加这个。回复:"resource": "resource_server_1", "token_type": "bearer", "access_token": "ewNDkyMjcyLCJ1bmlx...OiJqa2R6Ii", "expires_in": "3600", "id_token": "eyJhaWF0I..r"

以上是关于如何更改 asp.net core 1 中的令牌响应?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 ASP.NET Core 中的密码重置令牌中检索用户?

Asp.Net Core Identity 使用 JWT 中的哪些信息来将令牌授权为有效?

如何在 asp.net core 中设置 jwt 令牌的生命周期

如何撤销存储在 Identity Server 数据库中的 asp net core 中的刷新令牌

ASP.NET Core 2.1 API JWT 令牌 Session.id 在每次请求时都会更改

如何从 Asp.net Core 中的查询字符串验证 Azure AD B2C 令牌?