簡體   English   中英

使用OpenIddict請求令牌時,如何添加要返回的自定義聲明?

[英]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結構形式返回聲明,則可以使用其他常量。

使用事件模型(在Startup.cs中):

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方法中的OpenIdConnectOptionsEvents屬性來做到這一點,例如:

            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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM