使用AddIdentityCore登录ASP.NET Core时出现IdentityUserClaim DbSet错误
解决ASP.NET Core Identity使用AddIdentityCore时登录报错"Cannot create a DbSet for 'IdentityUserClaim'"
问题场景
在ASP.NET Core项目中使用AddIdentityCore而非AddDefaultIdentity配置Identity框架,调用SignInManager.PasswordSignInAsync执行登录操作时,触发错误:Cannot create a DbSet for 'IdentityUserClaim<string>'
问题根源
Identity框架默认会尝试使用基类IdentityUserClaim<string>操作用户声明数据,但项目中自定义了AppUserClaim实体,且未告知Identity框架使用该自定义实体,导致框架无法找到对应DbSet。
解决方案
1. 确保自定义声明实体继承正确基类
AppUserClaim需要继承IdentityUserClaim<string>,并添加与AppUser的导航属性:
public class AppUserClaim : IdentityUserClaim<string> { public virtual AppUser AppUser { get; set; } }
2. 修正Identity服务配置,指定自定义实体
在服务注册时,显式指定Identity使用你的自定义实体(包括Claim、Login、Token),通过自定义UserStore实现:
builder.Services.AddIdentityCore<AppUser>(options => { options.SignIn.RequireConfirmedAccount = true; options.SignIn.RequireConfirmedEmail = true; options.Password.RequiredLength = 6; options.Password.RequireNonAlphanumeric = false; options.Password.RequireDigit = false; options.Password.RequireLowercase = false; options.Password.RequireUppercase = false; options.User.RequireUniqueEmail = true; }) // 指定自定义UserStore,关联你的实体类型 .AddUserStore<UserStore<AppUser, VincheckDbContext, string, AppUserClaim, AppUserLogin, AppUserToken>>() .AddSignInManager<SignInManager<AppUser>>() .AddEntityFrameworkStores<VincheckDbContext>() .AddDefaultTokenProviders();
3. 修正LoginModel中的语法错误
LoginModel的OnGetAsync和OnPostAsync方法存在多余括号的语法错误,修正为:
public async Task OnGetAsync(string returnUrl = null) { returnUrl ??= Url.Content("~/"); await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme); ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList(); ReturnUrl = returnUrl; } public async Task<IActionResult> OnPostAsync(string returnUrl = null) { returnUrl ??= Url.Content("~/"); ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList(); if (ModelState.IsValid) { var result = await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, false); if (result.Succeeded) { _logger.LogInformation("User logged in."); return LocalRedirect(returnUrl); } else { ModelState.AddModelError(string.Empty, "Invalid login attempt."); return Page(); } } return Page(); }
4. 验证DbContext配置
确保VincheckDbContext中已正确注册AppUserClaims DbSet,且OnModelCreating中对AppUserClaim的配置正确(现有配置已满足,可忽略此步骤)。
内容的提问来源于stack exchange,提问作者Moka Buludlu
相关产品推荐
相关产品推荐

