使用自定义标识数据库而不是ASP.NET核心标识

时间:2017-06-10 13:12:46

标签: c# cookies asp.net-core-mvc asp.net-identity

使用自定义标识数据库而不是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));

enter image description here

2 个答案:

答案 0 :(得分:1)

您需要在“{name}”的构造函数中提供您在“name”声明中使用的相同声明类型:

var identity = new ClaimsIdentity(
    claims,
    "MyCookieMiddlewareInstance",
    "name",
    ClaimTypes.Role);

如果您未指定声明类型,则默认值为ClaimTypes.NameClaimTypes.Role,您将调试器分别看作NameClaimTypeRoleClaimType

答案 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;