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

ASP.NET MVC(.NET4.7.2)二次登录报403 Azure应用网关v2错误

.NET 4.7.2 ASP.NET MVC 集成微软账号登录二次登录报403问题

问题描述

  • 项目基于 .NET Framework 4.7.2 的 ASP.NET MVC 框架搭建,参照微软官方教程完成微软账号登录功能集成
  • 故障表现:
    • 首次使用微软账号登录后,可以正常访问主页
    • 退出账号后再次登录,无法正常跳转回主页,返回 403 Forbidden 错误,响应头显示错误由 Microsoft-Azure-Application-Gateway/v2 抛出
    • 清除全部浏览记录、关闭浏览器后重新打开页面,首次登录可以正常访问,第二次登录必定复现上述错误
  • 初步排查结论:
    检查浏览器存储的Cookie发现,.AspNet.Cookies 是触发问题的直接原因,手动删除这个Cookie之后再访问页面就完全正常,没有任何报错。
  • 错误截图:
    错误截图
  • 已尝试的修复操作:
    参照微软官方给出的OWIN SameSite配置教程,实现了SameSiteCookieManager类,并且在startup.cs中添加了对应的Cookie配置,但是修改后问题没有解决,使用的配置代码如下:
    public void Configuration(IAppBuilder app)
    {
        app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = CookieAuthenticationDefaults.AuthenticationType,
            LoginPath = new PathString("/Home/Login"),
            CookieSameSite = SameSiteMode.Lax,
            CookieManager = new SameSiteCookieManager(new SystemWebCookieManager())
        });
    }
    
    该问题已经排查近两周没有进展,需要定位根因并解决。

问题根因与修复方案

这个问题是.NET Framework 4.7.2 + OWIN Cookie认证组合的典型已知问题,核心是三层逻辑冲突导致的:

  • OWIN默认的Cookie写入逻辑和IIS、.NET Framework内置的Cookie处理链路不同步,退出登录时旧的.AspNet.Cookies不会被完全清理
  • 仅在OWIN启动类中配置CookieSameSite参数不会同步修改IIS层面的Cookie写入规则,会导致最终下发给浏览器的Cookie属性不一致,甚至出现重复的同名Set-Cookie响应头
  • 二次登录时浏览器会同时携带旧的残留Cookie和新下发的认证Cookie,Azure应用网关的WAF规则检测到非法/重复的认证Cookie后,会直接返回403拦截。

按以下步骤操作即可修复:

  • 第一步:补全web.config的框架级Cookie配置,从根源避免IIS和OWIN配置冲突。在system.web节点下追加/修正如下配置,确保站点运行时版本和Cookie规则统一:
<system.web>
  <httpCookies sameSite="Lax" requireSSL="true" />
  <compilation targetFramework="4.7.2" />
  <httpRuntime targetFramework="4.7.2" />
  <authentication mode="None" />
  <!-- 原有其他配置保持不变 -->
</system.web>
  • 第二步:修复退出登录逻辑,不要完全依赖OWIN默认的SignOut方法清理Cookie,在退出动作中手动强制删除存量认证Cookie,参考代码如下:
public ActionResult Logout()
{
    // 原有OpenIdConnect和Cookie认证退出逻辑保留
    HttpContext.GetOwinContext().Authentication.SignOut(
        CookieAuthenticationDefaults.AuthenticationType,
        OpenIdConnectAuthenticationDefaults.AuthenticationType);
    
    // 追加手动清理逻辑,彻底删除残留.AspNet.Cookies
    var oldAuthCookie = Request.Cookies[".AspNet.Cookies"];
    if (oldAuthCookie != null)
    {
        oldAuthCookie.Expires = DateTime.UtcNow.AddDays(-2);
        oldAuthCookie.HttpOnly = true;
        oldAuthCookie.Secure = Request.IsSecureConnection;
        Response.Cookies.Add(oldAuthCookie);
    }

    return RedirectToAction("Index", "Home");
}
  • 第三步:检查你实现的SameSiteCookieManager代码,确保写入Cookie时会主动清除IIS重复追加的Set-Cookie头,网上很多流传的实现只处理了SameSite=None的兼容场景,没有处理重复Set-Cookie头的问题,这也是配置了CookieManager依然不生效的核心原因。
  • 第四步:所有配置修改完成后重启站点,第一次测试前手动清除浏览器中该域名下的所有存量Cookie,再走登录-退出-二次登录流程即可恢复正常。如果开了应用网关的WAF日志,可以看到之前的拦截记录触发原因是请求携带重复Cookie键,修复后该类拦截会完全消失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 05:55:05