Asp.Net Core 2.2 - 如何在使用两个 AuthorizationSchemes、JWT 和 cookie 时返回当前用户 ID

Posted

技术标签:

【中文标题】Asp.Net Core 2.2 - 如何在使用两个 AuthorizationSchemes、JWT 和 cookie 时返回当前用户 ID【英文标题】:Asp.Net Core 2.2 - How to return the Current user ID when using Two AuthorizationSchemes, JWT and cookies 【发布时间】:2019-12-26 01:48:22 【问题描述】:

有时使用 Login razor 页面进行身份验证,有时使用 Postman 进行身份验证,我希望在项目中的任何类型的控制器方法中使用相同的 userId。

这是我目前使用的静态类助手

public static class Utilities

    public static Guid GetUserId(ClaimsPrincipal user)
    
        var userId =   user.FindFirst(JwtClaimTypes.Subject)?.Value?.Trim();

        return Guid.Parse(userId);
    

    public static string[] GetRoles(ClaimsPrincipal identity)
    
        return identity.Claims
            .Where(c => c.Type == JwtClaimTypes.Role)
            .Select(c => c.Value)
            .ToArray();
    

在上面的 GetUserId 方法处设置断点, 使用 Cookie 方案时,返回正确的 Id,但使用 JWT 方案时 GetUserId 得到空值。

我之前测试过其他两种方法都不能正常工作的方法。那么适用于两者的最短实现是什么?

编辑:

根据@ChrisPratt 的建议,将 GetUserId 方法更改如下:

public static Guid GetUserId(ClaimsPrincipal user)

  var userId = Guid.Parse(user.FindFirstValue(ClaimTypes.NameIdentifier));
  return userId;

但是当将鼠标悬停在用户 -> 身份 -> 声明上时,我得到 Count = 0

所以现在由于following this answer 不能使用Claim,我该如何编写上面的类以及ControllerBase 暴露的User 属性?

【问题讨论】:

【参考方案1】:

不确定您尝试了什么,但无论身份验证方案如何,最终结果都应该是您的HttpContext 上的ClaimsPrincipal 实例。您通常获取用户 ID 的方式是简单地获取 NameIdentifier 声明:

var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);

【讨论】:

对不起这个答案不起作用,我得到错误:用户不包含FindFirstValue的定义,还引入HTTPContext需要将类转换为非静态,这会触发很多变化在项目代码中。 你需要添加一个 using。除此之外,如果需要更改,请进行更改。你不应该首先使用静力学。那,如果这是一个库,您只需从具有 HttpContext(控制器等)的某个地方传入用户 ID。图书馆绝对不应该知道如何从系统中检索用户 ID。 为了更准确,我已经编辑了问题,请看一下。

以上是关于Asp.Net Core 2.2 - 如何在使用两个 AuthorizationSchemes、JWT 和 cookie 时返回当前用户 ID的主要内容,如果未能解决你的问题,请参考以下文章

如何在启用 ASP.NET Core 2.2 EndpointRouting 的情况下使用 RouteDataRequestCultureProvider?

这是如何使用 Entity Framework Core 和 ASP.NET Core MVC 2.2+ 和 3.0 创建数据传输对象 (DTO)

如何使用 Visual Studio 2019 在 ASP.NET Core 2.2 中安装 Font Awesome [关闭]

如何使用 Asp.Net Core 2.2 / IdentityServer4 / SP.NET Core Identity 手动散列密码

Asp.Net Core 2.2 - 如何在使用两个 AuthorizationSchemes、JWT 和 cookie 时返回当前用户 ID

如何在asp.net core razor pages 2.2中设置日期格式和文化