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

无需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页面
  • 跳转到首页后自动重新登录

问题根源

  1. 直接跳转微软登出地址未清理ASP.NET Core本地认证Cookie,导致应用仍识别用户身份,触发自动重登
  2. 默认情况下/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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 18:22:03