[英]How can I add custom claims to be returned when requesting a token using OpenIddict?
我正在构建ASP.NET Core 1.1应用程序(跨平台),并尝试(使用此示例 )在请求/connect/token
端点时向返回的access_token
添加自定义声明。
我需要的不仅是返回在access_token
序列化的声明,而且要在响应中返回它们,如下所示:
{
"token_type": "Bearer",
"access_token": "...",
"expires_in": 1799,
"custom_claim": "..."
}
我在Internet上发现必须使用AspNet.Security.OpenIdConnect.Server
并编写我的提供程序才能执行我想要的操作。
使用第一个样本不是简单的方法吗?
我正在使用OAUth 2.0,授予Password
类型,并且没有JWT。
不要求不使用JWT,这只是我在ASP.NET 4.5中曾经使用过OAuth
我需要的不仅是返回在access_token中序列化的声明,而且要在响应中返回它们,如下所示:
尽管我鼓励您将这些声明存储在身份令牌中,以便客户端可以以完全标准的方式轻松读取它们,但在OpenIddict 1.0和2.0 RTM中还是可以的。 为此,您有2个选择:
ticket.SetProperty("custom_claim" + 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["custom_claim"] = principal.FindFirst("your_claim_attached_to_the_principal").Value;
}
return Task.FromResult(OpenIddictServerEventState.Unhandled);
});
})
// Register the OpenIddict validation handler.
.AddValidation();
好吧,我们通过在添加Open Id Connect中间件时使用Startup类的Configure方法中的OpenIdConnectOptions的Events属性来做到这一点,例如:
Events = new OpenIdConnectEvents
{
OnTicketReceived = n =>
{
//TODO Your logic here to add custom claims via n.Principal.Identities.First().AddClaims();
return Task.CompletedTask;
}
}
这是您的用例的一种选择吗?
作为@Pinpoint在他的openiddict-samples
库中的回答,我关注了本文 (在“ Implementing the Connect/Token Endpoint
部分中)。
我从他的回答中发现,我想做的不是标准的,这就是为什么它不那么明显和容易做到的原因。
您需要使用JWT并向其中添加自定义声明,以便客户端可以对其进行解码并获得声明,而不是通过自身的响应发送它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.