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