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

如何在遵循仓储模式的Asp.Net Core 5.0项目中实现.Net Core Identity

解决方案

核心问题是Identity服务、DbContext配置位置错误,同时API接口存在参数绑定异常,按如下步骤调整即可:

  • 调整配置放置位置
    所有Identity、ApplicationContext相关的服务注册,都要放在Web API项目的ConfigureServices方法中。两个管理员门户作为前端客户端,不需要直接访问数据库,也不需要配置任何Identity相关服务,直接删除你之前在超级管理员门户Startup.cs中添加的两段配置即可。

  • 补全API项目的完整配置
    在API项目的ConfigureServices中按如下方式配置(以SQL Server为例,其他数据库修改对应提供器即可):
    首先注册ApplicationContext,指定数据库连接字符串:

// 需提前在API项目的appsettings.json中配置对应名称的数据库连接字符串
services.AddDbContext<ApplicationContext>(options =>
    options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

再注册Identity服务:

services.AddIdentity<ApplicationUser, IdentityRole>()
        .AddEntityFrameworkStores<ApplicationContext>()
        .AddDefaultTokenProviders();

同时要在API项目的Configure方法中,确保身份验证、授权中间件的顺序正确:

app.UseRouting();

// 必须放在UseRouting之后、UseEndpoints之前
app.UseAuthentication();
app.UseAuthorization();

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers();
});
  • 修复API接口的参数绑定问题
    前端POST提交的是JSON格式字符串,后端简单类型参数需要添加[FromBody]特性才能正确接收,否则会出现参数为空或者400错误,修正后的接口代码如下:
[HttpPost]
[Route("AddNewRole")]
public async Task<IActionResult> AddNewRole([FromBody] string role)
{
    if (string.IsNullOrWhiteSpace(role))
    {
        return BadRequest("角色名称不能为空");
    }
    var createResult = await _roleManager.CreateAsync(new IdentityRole(role.Trim()));
    if (createResult.Succeeded)
    {
        return new JsonResult(true);
    }
    // 返回具体错误信息方便前端排查
    var errorMsg = string.Join(";", createResult.Errors.Select(e => e.Description));
    return BadRequest(errorMsg);
}
  • 统一迁移执行入口
    所有Code First迁移操作都统一在API项目或者仓储类库中执行,执行迁移命令时指定ApplicationContext作为上下文,避免生成多余的DbContext和迁移文件,示例命令:
# 添加迁移
Add-Migration AddIdentityTables -Context ApplicationContext -Project 你的仓储类库项目名称 -StartupProject 你的API项目名称
# 更新数据库
Update-Database -Context ApplicationContext -Project 你的仓储类库项目名称 -StartupProject 你的API项目名称

额外注意:确保仓储类库中ApplicationContext的继承声明正确,泛型参数匹配你自定义的用户和角色类型,示例:

public class ApplicationContext : IdentityDbContext<ApplicationUser, IdentityRole, string>
{
    public ApplicationContext(DbContextOptions<ApplicationContext> options) : base(options)
    {
    }

    // 其他业务表的DbSet声明
}

内容的提问来源于stack exchange,提问作者Noor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 23:57:02