[英]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.