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

