【问题标题】:OpenIddict Get User Id in the token ResponseOpenIddict 在令牌响应中获取用户 ID
【发布时间】:2016-11-28 10:48:08
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    理想情况下,考虑使用身份令牌 - 根据定义,始终是 JWT - 在您指定 scope=openid 时由 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();
    

    【讨论】:

    • 考虑到我遇到的所有摩擦,我还没有尝试过,我认为现在升级到 .NET Core 还为时过早,值得等待一年左右。无论如何,谢谢您的回复。
    猜你喜欢
    • 2016-04-20
    • 1970-01-01
    • 2018-04-05
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 2020-05-05
    • 2021-07-05
    相关资源
    最近更新 更多