3

我正在构建 ASP.NET Core 1.1 应用程序(跨平台)并尝试(使用此示例access_token)在请求/connect/token端点时向返回的返回添加自定义声明。
我需要的是不仅返回序列化的声明,access_token而且在响应中返回它们,如下所示:

{
 "token_type": "Bearer",
 "access_token": "...",
 "expires_in": 1799,
 "custom_claim": "..."
}

我在互联网上发现我必须使用AspNet.Security.OpenIdConnect.Server并编写我的提供程序才能做我想做的事情。
没有使用第一个示例的简单方法吗?
我使用的是 OAUth 2.0,授权类型Password,没有 JWT。
不是不使用 JWT 的要求,只是我在 ASP.NET 4.5 中使用过 OAuth

4

3 回答 3

5

我需要的是不仅返回在 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();
于 2016-11-09T10:29:23.177 回答
1

好吧,当您添加 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;
                }
            }

这是您的用例的选择吗?

于 2016-11-09T10:16:12.217 回答
0

作为@Pinpoint 在他的存储库中的回答,openiddict-samples我关注了这篇文章(在该Implementing the Connect/Token Endpoint部分中)。
我从他的回答中发现我正在尝试做的事情不是标准的,这就是为什么它不是那么明显和容易做到的原因。
您需要使用 JWT 并向其添加自定义声明,以便客户端可以对其进行解码并获取声明,而不是通过它自己的响应发送它们。

于 2016-11-09T12:28:33.450 回答