无需Microsoft.Identity.Web.UI的Blazor Server Azure Entra ID登出方案
Blazor Server (.NET 8) Azure Entra ID OIDC 登出问题解决方案(无需Microsoft.Identity.Web.UI)
问题背景
基于.NET 8的Blazor Server应用,使用Azure Entra ID(AD)结合OpenIdConnect实现SSO登录正常,但自定义登出(不使用Microsoft.Identity.Web.UI组件)时出现两个问题:
- 跳转微软登出地址后,被重定向到空白的
/signout-oidc页面 - 跳转到首页后自动重新登录
问题根源
- 直接跳转微软登出地址未清理ASP.NET Core本地认证Cookie,导致应用仍识别用户身份,触发自动重登
- 默认情况下
/signout-oidc端点无处理逻辑,因此显示空白页面
解决方案
1. 配置/signout-oidc端点,清理本地认证会话
在Program.cs中添加端点处理逻辑,用于清理本地Cookie并重定向到首页:
// 顶部添加引用 using Microsoft.AspNetCore.Authentication.Cookies; // ... 其他配置代码 ... // 注册HttpContextAccessor(如果未注册) builder.Services.AddHttpContextAccessor(); // 认证配置修改 builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(options => { builder.Configuration.Bind("AzureAd", options); options.SignedOutCallbackPath = "/signout-oidc"; }) .AddCookie(options => { options.ExpireTimeSpan = TimeSpan.FromHours(1); // 可选:调整Cookie过期时间 }); // ... 其他中间件配置 ... // 添加/signout-oidc端点处理 app.MapGet("/signout-oidc", async (HttpContext context) => { // 清理本地认证Cookie await context.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); // 重定向到应用首页 return Results.Redirect("/"); });
2. 正确构建登出URL
修改Blazor组件中生成登出链接的逻辑,使用租户ID而非common(单租户场景),确保回调地址合法:
@inject IConfiguration Configuration @inject IHttpContextAccessor HttpContextAccessor @code { private string logoutRedirectUri; protected override void OnInitialized() { var request = HttpContextAccessor.HttpContext.Request; var tenantId = Configuration["AzureAd:TenantId"]; var loginHint = HttpContextAccessor.HttpContext.User.FindFirstValue("login_hint"); var postLogoutUri = Uri.EscapeDataString($"{request.Scheme}://{request.Host}{request.PathBase}/signout-oidc"); logoutRedirectUri = $"https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/logout?post_logout_redirect_uri={postLogoutUri}"; if (!string.IsNullOrEmpty(loginHint)) { logoutRedirectUri += $"&logout_hint={Uri.EscapeDataString(loginHint)}"; } } }
3. 配置Azure Entra ID应用注册的登出回调地址
登录Azure门户,进入你的应用注册:
- 导航至认证页面
- 在重定向URI列表中添加你的
/signout-oidc完整地址(例:https://your-app-domain.com/signout-oidc) - 保存配置
验证效果
点击登出链接后,会先跳转到微软的登出页面完成Azure Entra ID会话注销,随后自动重定向到/signout-oidc端点清理本地Cookie,最终跳转至首页,此时用户已完全登出,不会自动重新登录。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

