如何在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"; });
额外注意事项
- Entra ID应用注册配置检查:
- 在应用注册的Web板块中,添加
https://localhost:44363/signout-oidc(你的实际域名+SignedOutCallbackPath)作为登出重定向URI(区分普通登录重定向URI)。 - 确保
https://localhost:44363/home/index已添加到Web重定向URI列表中。
- 在应用注册的Web板块中,添加
- 浏览器缓存清理:测试前清除浏览器缓存,避免旧会话信息干扰。
- 使用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
相关产品推荐
相关产品推荐

