繁体   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