将ASP.NET Core与OpenIddict密码授予一起使用。
调用身份验证终点时,我得到了这个:
{
"token_type": "Bearer",
"access_token": "eyJhbGciOiJ...",
"expires_in": 1800
}
如何在响应中包含用户ID?我可以在解码的令牌中看到它,但我的用户应用程序不会解码它。
答案 0 :(得分:4)
如何在响应中包含用户ID?
理想情况下,在指定scope=openid
时,请考虑使用身份标记 - 始终是JWT定义 - 由OpenIddict返回。
或者,您也可以启用userinfo端点并发送userinfo请求以获取包含用户标识符的sub
声明:http://openid.net/specs/openid-connect-core-1_0.html#UserInfo。
如果您真的更喜欢将用户标识符作为令牌响应属性返回,则有两个选项:
ticket.SetProperty("user_id" + OpenIddictConstants.PropertyTypes.String, user.Id);
注意:OpenIddictConstants.PropertyTypes.String
是一个特殊后缀,表示添加到故障单的身份验证属性可以作为令牌响应的一部分公开。如果您希望将标识符作为JSON编号或更复杂的JSON结构返回,则可以使用其他常量。
services.AddOpenIddict()
// Register the OpenIddict core services.
.AddCore(options =>
{
// ...
})
// Register the OpenIddict server handler.
.AddServer(options =>
{
// ...
options.AddEventHandler<OpenIddictServerEvents.ApplyTokenResponse>(
notification =>
{
if (string.IsNullOrEmpty(notification.Context.Error))
{
var principal = notification.Context.Ticket.Principal;
var response = notification.Context.Response;
response["user_id"] = principal.FindFirst(OpenIddictConstants.Claims.Subject).Value;
}
return Task.FromResult(OpenIddictServerEventState.Unhandled);
});
})
// Register the OpenIddict validation handler.
.AddValidation();