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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 15:06:04