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

ASP.NET Core MVC中OpenID登出功能异常,求代码修正及跳转配置

修正ASP.NET Core 6 MVC + Okta OIDC登出功能问题

以下是针对登出失败及自定义跳转需求的修正方案:

核心问题分析

  1. 配置项混淆:Okta配置中PostLogoutRedirectUri与SignOutRedirectUri的角色定义错误,导致回调与最终跳转逻辑紊乱。
  2. 事件处理逻辑错误:OnSignedOutCallbackRedirect事件中设置的重定向地址指向了回调端点,而非目标自定义仪表板。
  3. 会话清除不彻底:需确保本地Cookie与Okta端会话同时被终止。

修正步骤及代码

1. 调整Okta配置项含义

明确各配置的作用:

  • PostLogoutRedirectUri:Okta完成登出后回调应用的端点(固定为signout-oidc,需在Okta后台配置为允许的地址)
  • SignOutRedirectUri:应用处理完回调后,最终跳转的自定义仪表板地址

修正后的配置:

"Okta": {
    "ClientId": "1A993j2wHzXomRJ6gvsdOc297",
    "ClientSecret": "V2c23523gftBY6ep-ILwfsdrm_oa6c0n2jt8JMU",
    "Domain": "https://login-qa.abc/oauth2/default",
    "PostLogoutRedirectUri": "https://localhost:45515/signout-oidc",
    "RedirectUri": "https://localhost:45515/signin-oidc",
    "SignOutRedirectUri": "https://qa.my.abc/"
}

2. 修正OpenIdConnect配置

优化事件逻辑,确保登出流程正确执行:

  • 移除手动设置RedirectUri的冗余代码(框架会自动读取配置)
  • 修正OnSignedOutCallbackRedirect事件,直接跳转到自定义仪表板
  • 将UseTokenLifetime设为false,让应用自主控制Cookie生命周期,避免会话残留

修正后的AddOpenIdConnect代码:

AddOpenIdConnect(oidcOptions =>
{
    oidcOptions.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    oidcOptions.Authority = configuration.GetValue<string>("Okta:Domain");
    oidcOptions.ClientId = configuration.GetValue<string>("Okta:ClientId");
    oidcOptions.ClientSecret = configuration.GetValue<string>("Okta:ClientSecret");

    oidcOptions.Scope.Add("openid");
    oidcOptions.Scope.Add("profile");
    oidcOptions.Scope.Add("email");

    oidcOptions.SaveTokens = true;
    oidcOptions.UseTokenLifetime = false;
    oidcOptions.RequireHttpsMetadata = true;
    oidcOptions.UsePkce = true;

    oidcOptions.Events = new OpenIdConnectEvents
    {
        OnRedirectToIdentityProviderForSignOut = async ctx =>
        {
            ctx.ProtocolMessage.PostLogoutRedirectUri = configuration.GetValue<string>("Okta:PostLogoutRedirectUri");
            await Task.CompletedTask;
        },
        OnSignedOutCallbackRedirect = context =>
        {
            context.Response.Redirect(configuration.GetValue<string>("Okta:SignOutRedirectUri"));
            context.HandleResponse(); // 终止默认流程,确保跳转生效
            return Task.CompletedTask;
        },
    };
});

3. 优化Logout控制器方法

确保同时清除本地Cookie并触发Okta全局登出,明确跳转逻辑:

[Authorize]
public async Task<IActionResult> Logout()
{
    var properties = new AuthenticationProperties
    {
        RedirectUri = configuration.GetValue<string>("Okta:SignOutRedirectUri")
    };

    // 先清除本地认证Cookie
    await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
    // 触发Okta端登出流程
    return SignOut(properties, OpenIdConnectDefaults.AuthenticationScheme);
}

4. 必要的后台配置检查

  • 在Okta应用设置中,将https://localhost:45515/signout-oidc添加到「注销重定向URI」列表
  • 确认https://qa.my.abc/已被Okta列为信任的重定向地址

内容的提问来源于stack exchange,提问作者Vish

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 05:46:11