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

.NET 9混合模式Blazor Web集成Azure AD B2C遇阻求助

.NET 9 Blazor Web 混合模式集成 Azure AD B2C 解决方案

一、核心配置思路

Blazor Web混合模式下实现Server与WASM共享身份,核心是依托Microsoft.Identity.Web,通过Cookie会话 + JWT令牌共享的方式实现一次登录两端复用:

  • Server端以Cookie维持会话,同时缓存Azure AD B2C颁发的ID Token/Access Token
  • WASM端通过Server端的认证上下文获取令牌,避免重复登录流程
  • 两端必须共用同一Azure AD B2C租户配置,保证令牌的颁发者、受众完全匹配,这是避免重定向循环的关键

二、分步实现步骤

1. 项目初始化

创建.NET 9 Blazor Web项目时选择无身份验证,放弃依赖旧版向导——.NET 9已统一Blazor Web项目结构,不再使用_Host.cshtml,改用Routes.razor作为路由入口。

2. 安装依赖包

在项目中安装以下NuGet包:

Install-Package Microsoft.Identity.Web
Install-Package Microsoft.Identity.Web.UI
Install-Package Microsoft.AspNetCore.Components.WebAssembly.Authentication

3. Server端配置(Program.cs)

注册Azure AD B2C认证服务,同时启用Cookie认证(供Server端)和JWTBearer认证(供WASM端调用):

// 注册Azure AD B2C服务,启用令牌获取与缓存
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAdB2C"))
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddInMemoryTokenCaches();

// 为WASM端添加JWTBearer认证验证
builder.Services.AddAuthentication()
    .AddJwtBearer(options =>
    {
        options.Authority = $"https://{builder.Configuration["AzureAdB2C:TenantName"]}.b2clogin.com/{builder.Configuration["AzureAdB2C:TenantId"]}/{builder.Configuration["AzureAdB2C:SignUpSignInPolicyId"]}/v2.0/";
        options.Audience = builder.Configuration["AzureAdB2C:ClientId"];
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidIssuer = $"https://{builder.Configuration["AzureAdB2C:TenantName"]}.b2clogin.com/{builder.Configuration["AzureAdB2C:TenantId"]}/v2.0/",
            NameClaimType = "name"
        };
    });

// 配置授权策略,设置默认授权要求
builder.Services.AddAuthorization(options =>
{
    options.FallbackPolicy = options.DefaultPolicy;
});

// 启用认证、授权中间件(顺序不能错)
app.UseAuthentication();
app.UseAuthorization();

在appsettings.json中添加Azure AD B2C配置:

"AzureAdB2C": {
  "Instance": "https://<你的租户名>.b2clogin.com/",
  "TenantId": "<你的租户ID>",
  "ClientId": "<你的应用注册ID>",
  "Domain": "<你的租户域名>",
  "SignUpSignInPolicyId": "B2C_1_<你的登录注册策略名>",
  "CallbackPath": "/signin-oidc",
  "SignedOutCallbackPath": "/signout-callback-oidc"
}

4. WASM端配置

在wwwroot/appsettings.json中添加与Server端一致的身份配置:

"AzureAdB2C": {
  "Authority": "https://<你的租户名>.b2clogin.com/<你的租户ID>/B2C_1_<你的登录注册策略名>/v2.0/",
  "ClientId": "<你的应用注册ID>",
  "ValidateAuthority": true
}

修改WASM端Program.cs,注册MSAL认证服务并关联Server端会话:

builder.Services.AddMsalAuthentication(options =>
{
    builder.Configuration.Bind("AzureAdB2C", options.ProviderOptions.Authentication);
    // 添加需要访问的API权限范围
    options.ProviderOptions.DefaultAccessTokenScopes.Add("<你的API范围(如https://<租户域名>/api/access)>");
    // 重定向模式下复用Server端登录会话
    options.ProviderOptions.LoginMode = "redirect";
});

5. 解决重定向循环问题

重定向循环多由以下原因导致,逐一排查:

  • 未在Azure AD B2C应用注册中添加完整的回复URL:需包含https://localhost:<端口>/signin-oidc(Server端)和https://localhost:<端口>/authentication/login-callback(WASM端)
  • 路由未正确配置授权:确保Routes.razor中使用AuthorizeRouteView包裹路由:
<Router AppAssembly="@typeof(App).Assembly">
    <Found Context="routeData">
        <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
            <NotAuthorized>
                <RedirectToLogin />
            </NotAuthorized>
        </AuthorizeRouteView>
    </Found>
    <NotFound>
        <PageTitle>Not found</PageTitle>
        <LayoutView Layout="@typeof(MainLayout)">
            <p role="alert">Sorry, there's nothing at this address.</p>
        </LayoutView>
    </NotFound>
</Router>

三、模式切换注意事项

后续切换至WASM模式时:

  • 无需重新配置Azure AD B2C,只需确保WASM端的令牌范围包含业务所需的API权限
  • 通过Blazor Web的RenderMode属性逐步切换组件渲染模式,身份上下文会自动共享
  • 若需WASM端独立登录,可将LoginMode改为popup,但仍需保证与Server端使用同一租户配置

四、文档筛选技巧

微软文档页面顶部均有版本选择器,明确选择**.NET 9或.NET 8+过滤旧版内容;优先查看Microsoft.Identity.Web官方文档中的Blazor Web**专属章节,避免混淆旧版Blazor Server/WASM单独文档。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 16:55:00