OpenIddict在令牌响应中获取用户ID

时间:2016-07-25 07:26:01

标签: asp.net-core asp.net-core-mvc openid-connect openiddict aspnet-contrib

将ASP.NET Core与OpenIddict密码授予一起使用。

调用身份验证终点时,我得到了这个:

{
  "token_type": "Bearer",
  "access_token": "eyJhbGciOiJ...",
  "expires_in": 1800
}

如何在响应中包含用户ID?我可以在解码的令牌中看到它,但我的用户应用程序不会解码它。

1 个答案:

答案 0 :(得分:4)

  

如何在响应中包含用户ID?

理想情况下,在指定scope=openid时,请考虑使用身份标记 - 始终是JWT定义 - 由OpenIddict返回。

或者,您也可以启用userinfo端点并发送userinfo请求以获取包含用户标识符的sub声明:http://openid.net/specs/openid-connect-core-1_0.html#UserInfo

如果您真的更喜欢将用户标识符作为令牌响应属性返回,则有两个选项:

使用特殊的“公共”属性(在授权控制器中,创建身份验证票证):

ticket.SetProperty("user_id" + 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["user_id"] = principal.FindFirst(OpenIddictConstants.Claims.Subject).Value;
                }

                return Task.FromResult(OpenIddictServerEventState.Unhandled);
            });
    })

    // Register the OpenIddict validation handler.
    .AddValidation();