.NET 5中如何为Admin区域用AzureAd、根区域使用常规Identity认证
该需求无法无额外手动开发成本完成,需要调整认证服务注册、授权策略、区域授权绑定三个环节的配置即可实现,具体步骤如下:
1 调整认证服务注册
去掉全局默认认证方案,同时注册Azure AD和ASP.NET Core Identity两套认证体系,示例代码如下:
public void ConfigureServices(IServiceCollection services) { // 注册数据库上下文(对应Identity的存储) services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); // 注册基于数据库的Identity认证方案 services.AddIdentity<IdentityUser, IdentityRole>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders(); // 注册Azure AD认证方案,不设置全局默认认证方案 services.AddAuthentication() .AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd"), OpenIdConnectDefaults.AuthenticationScheme); // 定义两套授权策略,分别绑定对应认证方案 services.AddAuthorization(options => { // Admin区域策略:要求Azure AD认证 options.AddPolicy("AdminPolicy", policy => { policy.AddAuthenticationSchemes(OpenIdConnectDefaults.AuthenticationScheme) .RequireAuthenticatedUser(); }); // 根区域策略:要求Identity体系认证 options.AddPolicy("FrontPolicy", policy => { policy.AddAuthenticationSchemes(IdentityConstants.ApplicationScheme) .RequireAuthenticatedUser(); }); }); // 用约定方式给不同区域自动绑定授权策略,无需手动给每个Controller加特性 services.AddControllersWithViews(options => { // Admin区域统一绑定AdminPolicy options.Conventions.AddAreaControllerModelConvention("Admin", model => { model.Filters.Add(new AuthorizeFilter("AdminPolicy")); }); // 无Area的根区域Controller统一绑定FrontPolicy options.Conventions.Add(new ControllerModelConvention(model => { if (string.IsNullOrEmpty(model.AreaName)) { model.Filters.Add(new AuthorizeFilter("FrontPolicy")); } })); }); services.AddRazorPages() .AddMicrosoftIdentityUI(); }
2 调整中间件配置
原中间件顺序无需修改,仅需合并重复的端点路由配置即可:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); // 认证、授权中间件顺序保持不变 app.UseAuthentication(); app.UseAuthorization(); // 合并端点配置,无需拆分两次UseEndpoints app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "areas", pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}"); endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); endpoints.MapRazorPages(); }); }
3 补充说明
- 你需要提前创建好Identity对应的
ApplicationDbContext,并做好数据库迁移,确保Identity的用户表正常生成 - 如果有部分页面允许匿名访问,直接给对应Controller或Action添加
[AllowAnonymous]特性即可覆盖全局约定 - 两套认证体系的登录、登出逻辑相互独立,Admin区域的登录跳转走Azure AD的认证流程,根区域走Identity的本地账号密码校验流程
内容的提问来源于stack exchange,提问作者Emre Beşirik
相关产品推荐
相关产品推荐

