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。
我在我的网络 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。