3

我正在使用 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);

        }
4

1 回答 1

3

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

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

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

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

于 2016-04-12T18:21:47.560 回答