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

使用IdentityRole时无法显示.NET Core Identity默认/login端点的问题

同时启用IdentityRole与.NET Identity默认端点的解决方案

我需要同时使用IdentityRole以及.NET Identity提供的默认端点(如/login),但运行项目后Swagger中仅能看到自定义端点,无法显示/login这类默认端点。

若移除以下启用角色的代码:

builder.Services
       .AddIdentity<AppUser, IdentityRole>()
       .AddEntityFrameworkStores<ApplicationDbContext>()
       .AddDefaultTokenProviders();

改用仅注册默认端点的代码:

builder.Services
       .AddIdentityApiEndpoints<AppUser>()
       .AddEntityFrameworkStores<ApplicationDbContext>(); 

虽然能在Swagger中看到默认端点,但会丢失IdentityRole相关功能。

解决方法

无需二选一,只需将两种配置结合,同时添加角色支持和默认端点注册,并确保映射端点到管道中。修改后的关键操作如下:

1. 服务注册部分

保留AddIdentity启用角色功能,同时添加AddIdentityApiEndpoints注册默认端点:

// 启用Identity并支持角色
builder.Services
       .AddIdentity<AppUser, IdentityRole>()
       .AddEntityFrameworkStores<ApplicationDbContext>()
       .AddDefaultTokenProviders();

// 注册Identity默认API端点
builder.Services.AddIdentityApiEndpoints<AppUser>()
       .AddEntityFrameworkStores<ApplicationDbContext>();

2. 管道配置部分

在app.MapControllers()之后添加app.MapIdentityApi<AppUser>(),确保默认端点被映射:

app.MapControllers();
// 映射Identity默认API端点
app.MapIdentityApi<AppUser>();

完整修改后的Program.cs代码

builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(option =>
{
    option.AddSecurityDefinition("oauth2", new 
    Microsoft.OpenApi.Models.OpenApiSecurityScheme
    {
        In = Microsoft.OpenApi.Models.ParameterLocation.Header,
        Name = "Authorization",
        Type = Microsoft.OpenApi.Models.SecuritySchemeType.ApiKey
    });
    option.OperationFilter<SecurityRequirementsOperationFilter>();
});
builder.Services.AddApplicationInsightsTelemetry();

// Add services to the container
builder.Services.AddControllers().AddJsonOptions(options =>
{
    options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
});

// 启用Identity并支持角色
builder.Services
       .AddIdentity<AppUser, IdentityRole>()
       .AddEntityFrameworkStores<ApplicationDbContext>()
       .AddDefaultTokenProviders();

// 注册Identity默认API端点
builder.Services.AddIdentityApiEndpoints<AppUser>()
       .AddEntityFrameworkStores<ApplicationDbContext>();

// Add Authentication
builder.Services.AddAuthentication();

// Add Authorization
builder.Services.AddAuthorization();

// Add CORS
builder.Services.AddCors(options =>
{
    options.AddDefaultPolicy(CorsPolicyBuilder =>
    {
        CorsPolicyBuilder.AllowAnyOrigin();
        CorsPolicyBuilder.AllowAnyHeader();
        CorsPolicyBuilder.AllowAnyMethod();
    });
});

// Add IHttpContextAccessor service
builder.Services.AddHttpContextAccessor();

// Configure Forwarded Headers Middleware
builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
    options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
    options.KnownProxies.Add(System.Net.IPAddress.Parse("127.0.0.1")); // 根据实际配置调整
});

// Role seeding method
async Task SeedRoles(IServiceProvider serviceProvider)
{
    var roleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
    var roles = new List<string> { "SchoolOwner", "Student", "Teacher", "Parent" }; 

    foreach (var role in roles)
    {
        if (!await roleManager.RoleExistsAsync(role))
        {
            await roleManager.CreateAsync(new IdentityRole(role));
        }
    }
}

var app = builder.Build();

// Call the role seeding method during app startup
using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;
    await SeedRoles(services);
}

app.MapControllers();
// 映射Identity默认API端点
app.MapIdentityApi<AppUser>();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}
app.UseCors();
app.UseHttpsRedirection();

// Enable Forwarded Headers Middleware
app.UseForwardedHeaders();

app.UseAuthentication();
app.UseAuthorization();

app.Run();

说明

  • AddIdentity<AppUser, IdentityRole>负责启用角色管理相关服务,确保RoleManager等功能可用,满足角色种子初始化等需求。
  • AddIdentityApiEndpoints<AppUser>负责注册/login、/register等默认Identity端点。
  • app.MapIdentityApi<AppUser>()将这些默认端点添加到请求管道中,Swagger才能扫描并显示这些端点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 09:32:07