You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 18:29:55