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
相关产品推荐
相关产品推荐

