我正在使用 OWIN / OAuth 和 OpenId Connect 身份验证(Microsoft.Owin.Security.OpenIdConnect
)在 C# ASP MVC Web 应用程序中。使用 Microsoft 帐户的 SSO 登录基本上可以正常工作,但有时我会在浏览器上收到一个错误页面,上面写着Bad Request - Request Too Long
.
我发现这个错误是由于cookie太多造成的。删除 cookie 在一段时间内会有所帮助,但过了一段时间后问题又回来了。
导致问题的cookie是从OpenId框架设置的,所以有几十个cookie,其名称如下OpenIdConnect.nonce.9oEtF53WxOi2uAw.......
.
这不是 SPA 应用程序,但某些部分会通过 ajax 调用定期刷新。
结果发现根本原因是Ajax调用。
有问题的流程是
1) OAuth cookie 一段时间后过期
2) 过期通常会导致页面重定向到login.microsoft.com
刷新cookie。在这一步中OAuth框架adds new nonce
cookie 到响应(每次)!
3)但是Ajax不处理域外的重定向(跨域到login.microsoft.com
)。但 cookie 已经附加到页面上。
4) 下一个定期 Ajax 调用重复该流程,导致“nonce”cookie 快速增加。
Solution
我必须扩展“OWIN OpenId”框架设置代码以不同方式处理 Ajax 调用 - 以防止重定向并停止发送 cookie。
public void ConfigureAuth(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
ClientId = clientId,
Authority = authority,
Notifications = new OpenIdConnectAuthenticationNotifications
{
RedirectToIdentityProvider = ctx =>
{
bool isAjaxRequest = (ctx.Request.Headers != null && ctx.Request.Headers["X-Requested-With"] == "XMLHttpRequest");
if (isAjaxRequest)
{
ctx.Response.Headers.Remove("Set-Cookie");
ctx.State = NotificationResultState.HandledResponse;
}
return Task.FromResult(0);
}
}
});
}
Ajax 调用者也必须进行调整才能检测到401
代码并执行全页面刷新(这导致快速重定向到 Microsoft 权威)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)