ClaimTypes.NameIdentifier returns 电子邮件地址不是 ID

ClaimTypes.NameIdentifier returns email address not Id

我在我的网络 API 项目中使用 HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value 来获取请求用户,用于身份验证。 NameIdentifier return 是当前用户的电子邮件,而 Google 搜索表明它应该是 returning 用户的 ID(Guid,在这种情况下,如果重要的话)。
为什么会发生这种情况,我如何 return 当前用户的 id 而无需数据库查询?

我在使用 ASP.net core 2.0 时遇到了同样的问题,因为我生成了这样的 jwt 令牌

public ClaimsIdentity GenerateClaimsIdentity(string email, string id)
{
    return new ClaimsIdentity(new GenericIdentity(email, "Token"), new[]
    {
        new Claim(Helpers.Constants.Strings.JwtClaimIdentifiers.Id, id),
        new Claim(Helpers.Constants.Strings.JwtClaimIdentifiers.Rol, Helpers.Constants.Strings.JwtClaims.ApiAccess)
    });
}

我试图通过 UserManager 获得 CurrentUser,但总是 returns null。我想在启动文件中将 UserIdClaimType 字符串更改为 "id"

var builder = services.AddIdentity<User,IdentityRole>(o =>
{
    // configure identity options
    o.Password.RequireDigit = false;
    o.Password.RequireLowercase = false;
    o.Password.RequireUppercase = false;
    o.Password.RequireNonAlphanumeric = false;
    o.Password.RequiredLength = 6;

    //this line
    o.ClaimsIdentity.UserIdClaimType = "id";
});

所以我搜索了一下,因为我遇到了同样的问题,根据 Auth0.com 论坛上的 this reply,出于某种原因,.NET 中的 JWT 身份验证处理程序将将 sub 声明映射到 NameIdentifier 声明类型。

所以解决方案不是设置 sub 声明类型,或将其设置为 id。