ASP.NET Core Razor Page登出重定向异常:点击登出后显示白屏
问题原因及解决方案
问题原因
- 你使用了
MicrosoftIdentity区域的登出端点,但自定义的SignOut方法仅处理了Cookie认证,未完成OpenID Connect(OIDC)的完整登出流程。当框架检测到OIDC会话存在时,会自动触发默认的OIDC登出请求,跳转到signout-oidc页面,而该页面未配置回调地址,导致白屏。 - 自定义的
SignOut逻辑与框架默认的OIDC登出流程冲突,导致重定向规则失效。
解决方案
方案一:利用框架自带流程配置重定向(推荐)
如果你的应用基于Microsoft Identity(如Azure AD、Identity Server等OIDC提供商),直接复用框架的登出流程并配置重定向地址即可:
- 移除自定义的
Account控制器SignOut方法,MicrosoftIdentity区域已提供默认的登出端点。 - 在
Program.cs中配置OIDC认证的登出重定向:
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(options => { builder.Configuration.Bind("AzureAd", options); // 设置登出后跳转至首页 options.PostLogoutRedirectUri = "/"; });
- 保留原登出按钮代码:
<a href='@Url.Action("SignOut", "Account", new { Area = "MicrosoftIdentity" })' class="logout-button">Logout</a>
点击登出后,框架会先完成OIDC提供商的会话登出,再自动跳转至你配置的首页。
方案二:自定义完整登出流程
如果需要手动控制登出逻辑,需同时处理OIDC和Cookie的登出流程:
- 修改
SignOut方法代码:
public async Task<IActionResult> SignOut() { // 触发OIDC登出,并指定登出后跳转地址 await HttpContext.SignOutAsync(OpenIdConnectDefaults.AuthenticationScheme, new AuthenticationProperties { RedirectUri = "/" }); // 清除本地Cookie认证会话 await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); return new EmptyResult(); }
- 调整登出按钮的地址(若自定义控制器不在
MicrosoftIdentity区域,需移除Area参数):
<a href='@Url.Action("SignOut", "Account")' class="logout-button">Logout</a>
关键注意点
- 使用OIDC认证时,登出必须同时处理本地Cookie会话和身份提供商的远程会话,仅清除Cookie会导致框架触发默认的OIDC登出流程,引发白屏问题。
- 确保
PostLogoutRedirectUri已在OIDC提供商的后台配置为允许的重定向地址(例如Azure AD的应用注册中需添加该地址到"登出URL"列表),否则可能会被提供商拦截。
内容的提问来源于stack exchange,提问作者Fabian H.
相关产品推荐
相关产品推荐

