使用自定义标识数据库而不是ASP.NET核心标识并通过cookie进行身份验证! (cookie auth按预期工作但是#34; User.Identity.Name"总是空的?)
如何设置和获取声明身份名称" User.Identity.Name" ?
var claims = new[] { new Claim("name", "john"), new Claim(ClaimTypes.Role, "Admin") };
var identity = new ClaimsIdentity(claims, "MyCookieMiddlewareInstance");
await HttpContext.Authentication.SignInAsync("MyCookieMiddlewareInstance", new ClaimsPrincipal(identity));
答案 0 :(得分:1)
您需要在“{name}”的构造函数中提供您在“name”声明中使用的相同声明类型:
var identity = new ClaimsIdentity(
claims,
"MyCookieMiddlewareInstance",
"name",
ClaimTypes.Role);
如果您未指定声明类型,则默认值为ClaimTypes.Name
和ClaimTypes.Role
,您将调试器分别看作NameClaimType
和RoleClaimType
。
答案 1 :(得分:1)
正如您在图片中看到的,名称声明的类型名称是http://schemas.xmlsoap.org/ws/2005/identity/claims/name
。这意味着您正在使用ws联合声明类型(这是默认值)。
您可以使用该默认类型来设置您的名称声明。
new Claim(ClaimTypes.Name, "john");
或者您可以覆盖StartUp
中的映射,这样可以避免在授权控制器中执行此操作。
services.Configure<IdentityOptions>(options =>
{
// or `= "name"` if you dont want the dependency
options.ClaimsIdentity.UserNameClaimType = OpenIdConnectConstants.Claims.Name;
}
另外两个声明类型名称会浮现在脑海中并且有意义覆盖这两个名称。
ClaimsIdentity.UserIdClaimType = OpenIdConnectConstants.Claims.Subject;
ClaimsIdentity.RoleClaimType = OpenIdConnectConstants.Claims.Role;