继承IdentityUser的类无法获取父类属性值,如何正确访问?
解决IdentityUser继承类内置属性未赋值的问题
这问题我之前踩过坑!核心原因大概率是你的ApplicationUser构造函数里只处理了自定义的LGID声明,却没把IdentityUser自带属性(比如Email)对应的Claims映射到类的属性上。
问题分析
当你通过var user = new ApplicationUser(identity)创建实例时,构造函数只会初始化你明确处理的属性。自定义的LGID能正常赋值,说明你已经在构造函数里读取了对应的Claim,但Email这类内置属性对应的Claim(比如ClaimTypes.Email)没被处理,自然就没值。
修正方案
1. 更新ApplicationUser的构造函数
在构造函数里手动添加对内置属性对应Claim的读取和赋值:
public class ApplicationUser : IdentityUser { // 你的自定义属性 public string LGID { get; set; } public ApplicationUser(ClaimsIdentity identity) { // 处理自定义LGID声明 var lgidClaim = identity.FindFirst("LGID"); if (lgidClaim != null) { LGID = lgidClaim.Value; } // 处理IdentityUser内置属性对应的Claim var emailClaim = identity.FindFirst(ClaimTypes.Email); if (emailClaim != null) { Email = emailClaim.Value; } // 按需添加其他需要的属性,比如UserName、Id等 var userNameClaim = identity.FindFirst(ClaimTypes.Name); if (userNameClaim != null) { UserName = userNameClaim.Value; } var userIdClaim = identity.FindFirst(ClaimTypes.NameIdentifier); if (userIdClaim != null) { Id = userIdClaim.Value; } } }
2. 确保登录时已生成对应Claims
还要确认你在登录流程中,已经把这些内置属性的Claims添加到了ClaimsIdentity里。比如验证用户成功后:
var userFromDb = await _userManager.FindByEmailAsync(loginModel.Email); if (userFromDb != null && await _userManager.CheckPasswordAsync(userFromDb, loginModel.Password)) { var claims = new List<Claim> { // 内置属性对应的Claim new Claim(ClaimTypes.Email, userFromDb.Email), new Claim(ClaimTypes.Name, userFromDb.UserName), new Claim(ClaimTypes.NameIdentifier, userFromDb.Id), // 自定义属性的Claim new Claim("LGID", userFromDb.LGID) }; var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme); await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(identity)); }
这样处理后,当你再通过new ApplicationUser(identity)创建实例时,Email等内置属性就能正常获取到值了。
内容的提问来源于stack exchange,提问作者Rilcon42
相关产品推荐
相关产品推荐

