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

如何在Microsoft Entra ID登出后重定向到指定页面

解决ASP.NET Core MVC中Microsoft Entra ID登出后重定向失效问题

我有一个ASP.NET Core MVC应用,使用Microsoft.Identity.Web.UI NuGet包实现Microsoft Entra ID身份验证,登录流程正常,但登出时跳转至Entra ID后,会返回站点的/signout-oidc?state=xxxxx页面(该页面不存在,显示空白),无法重定向到指定的应用内页面。


当前配置代码

Razor页面登出链接

<a href='@Url.Action("SignOut", "Account", new { Area = "MicrosoftIdentity" })'>Logout</a>

Program.cs中的身份验证配置

builder.Services.AddRazorPages()
    .AddMicrosoftIdentityUI();

builder.Services.AddMicrosoftIdentityWebAppAuthentication(builder.Configuration)
    .EnableTokenAcquisitionToCallDownstreamApi(builder.Configuration.GetSection("MyApi:Scopes").Get<string[]>())
    .AddMicrosoftGraph(builder.Configuration.GetSection("Graph"))
    .AddInMemoryTokenCaches();

builder.Services.Configure<OpenIdConnectOptions>(
    OpenIdConnectDefaults.AuthenticationScheme,
    options => {
        options.SignedOutCallbackPath = "/signout-oidc";
        options.SignedOutRedirectUri = "/home/index";
});

中间件配置

app.UseAuthentication();
app.UseAuthorization();

已在Microsoft Entra ID应用注册中配置了对应的重定向URI,但上述配置后仍无法正常重定向。


已尝试但无效的方法

  • 在登出链接中添加post_logout_redirect_uri参数:
    <a href='@Url.Action("SignOut", "Account", new { Area = "MicrosoftIdentity" })?post_logout_redirect_uri=%2Fhome%2Findex'>Logout</a>
    
  • 添加URL重写规则:
    app.UseRewriter(
        new RewriteOptions()
            .AddRewrite("/signout-oidc(.*)", "/home/index", false)
    );
    
  • 配置OnSignedOutCallbackRedirect事件处理器:
    builder.Services.Configure<OpenIdConnectOptions>(
        OpenIdConnectDefaults.AuthenticationScheme,
        options => {
            options.SignedOutCallbackPath = "/signout-oidc";
            options.SignedOutRedirectUri = "/home/index";
            options.Events.OnSignedOutCallbackRedirect = context => {
                context.Response.Redirect(context.Options.SignedOutRedirectUri);
                context.HandleResponse();
    
                return Task.CompletedTask;
            };
    });
    

正确解决方案

问题核心是直接配置OpenIdConnectOptions会被AddMicrosoftIdentityWebAppAuthentication的默认配置覆盖,需要使用Microsoft Identity Web提供的专属配置方式。

方法1:链式配置OpenIdConnect选项

在AddMicrosoftIdentityWebAppAuthentication的链式调用中直接设置登出参数,确保配置优先级:

builder.Services.AddMicrosoftIdentityWebAppAuthentication(builder.Configuration)
    .EnableTokenAcquisitionToCallDownstreamApi(builder.Configuration.GetSection("MyApi:Scopes").Get<string[]>())
    .AddMicrosoftGraph(builder.Configuration.GetSection("Graph"))
    .AddInMemoryTokenCaches()
    .AddOpenIdConnect(options => {
        options.SignedOutRedirectUri = "/home/index";
        options.SignedOutCallbackPath = "/signout-oidc";
    });

方法2:使用ConfigureMicrosoftIdentityOptions

通过Microsoft Identity Web提供的配置类来设置,避免被默认配置覆盖:

builder.Services.ConfigureMicrosoftIdentityOptions(
    MicrosoftIdentityOptionsNames.OpenIdConnect,
    options => {
        options.SignedOutRedirectUri = "/home/index";
        options.SignedOutCallbackPath = "/signout-oidc";
    });

额外注意事项

  1. Entra ID应用注册配置检查:
    • 在应用注册的Web板块中,添加https://localhost:44363/signout-oidc(你的实际域名+SignedOutCallbackPath)作为登出重定向URI(区分普通登录重定向URI)。
    • 确保https://localhost:44363/home/index已添加到Web重定向URI列表中。
  2. 浏览器缓存清理:测试前清除浏览器缓存,避免旧会话信息干扰。
  3. 使用Tag Helper优化登出链接:避免URL编码问题,使用ASP.NET Core Tag Helper生成链接:
    <a asp-area="MicrosoftIdentity" asp-controller="Account" asp-action="SignOut">Logout</a>
    

内容的提问来源于stack exchange,提问作者Carl Heinrich Hancke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 08:18:18