我的应用程序配置为重定向到身份验证错误的登录页面:
<configuration>
<system.webServer>
<httpErrors errorMode="Custom" defaultResponseMode="ExecuteURL">
<remove statusCode="401" />
<error statusCode="401" responseMode="Redirect" path="/Login" />
</httpErrors>
</system.webServer>
<configuration>
这会产生302重定向而不是401,并且用户将进入登录页面。在大多数浏览器上,这很好。在IE(10和11,我们支持的唯一版本)上,我们有时会看到此重定向被缓存,所以会发生这种情况:
/
/Login
/
/
时,它收到了302响应,因此它甚至不打算向服务器发送另一个请求,并立即循环回/Login
代替主要应用程序是MVC5,所以我尝试添加一个仅限IE的过滤器,强制它不缓存。例如:
public class InternetExplorerNoCacheFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (RequestBrowserIsInternetExplorer)
filterContext.HttpContext.Response.ExpiresAbsolute = DateTime.UtcNow.AddDays(-1);
}
}
它在普通页面上按预期执行。但不幸的是,web.config身份验证重定向发生在管道中的早期,因此我的过滤器不会被调用未经身份验证的请求,这是我最需要的地方。
我不想设置通用的无缓存标头,因为其他浏览器会负责任地缓存,并且会提高它们的性能。
如何有选择地阻止IE将未经身份验证的重定向缓存到“登录”页面?