使用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
相关产品推荐
相关产品推荐

