ASP.NET_SessionId+owin Cookies不发送到浏览器
我在使用owin cookie身份验证时遇到了一个奇怪的问题。
当我启动IIS服务器时,身份验证在IE/Firefox和Chrome上非常好。
我开始在不同的平台上进行身份验证和登录测试,并出现了一个奇怪的错误。偶尔,owin框架/IIS不向浏览器发送任何cookie。我将输入一个用户名和密码,这是正确的代码运行,但没有cookie被传递到浏览器。如果我重新启动服务器,它就会开始工作,然后在某个时候尝试登录,然后cookie再次停止交付。跨过代码,什么也不做,也不会抛出任何错误。
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationMode = AuthenticationMode.Active,
CookieHttpOnly = true,
AuthenticationType = "ABC",
LoginPath = new PathString("/Account/Login"),
CookiePath = "/",
CookieName = "ABC",
Provider = new CookieAuthenticationProvider
{
OnApplyRedirect = ctx =>
{
if (!IsAjaxRequest(ctx.Request))
{
ctx.Response.Redirect(ctx.RedirectUri);
}
}
}
});
更新1:问题的一个原因似乎是当我在会话中添加项目时,问题就开始了。添加一些简单的东西,比如Session.Content["ABC"]= 123
似乎造成了这个问题。
我能看到的是:1)(Chrome)当我登录时,我得到ASP.NET_SessionId+我的身份验证cookie。2)我浏览了一页设置会话的页面.内容.3)打开一个新浏览器(Firefox)并尝试登录,它既不会接收ASP.NET_SessionId,也不会获得身份验证Cookie 4)当第一个浏览器具有ASP.NET_SessionId时,它将继续工作。从我删除这个cookie的那一刻起,它就和我正在处理的IP地址(10.x.x)和本地主机上的所有其他浏览器一样的问题。
更新2:力的创造ASPNET_SessionId
在使用owin进行身份验证之前,首先在登录_LOAD页面上。
1)在我验证自己的身份之前,我先做一个随机的Session.Content
值,以启动ASP.NET_SessionId 2),然后进行身份验证并进行进一步的会话(3)其他浏览器现在似乎可以工作了。
这太奇怪了。我只能得出结论,这与ASP和owin认为他们在不同的领域或类似的事情有关。
更新3-两者之间的奇怪行为。
另外还发现了一些奇怪的行为-OWIN和ASP会话的超时是不同的。我看到的是,通过某种机制,我自己的会话比我的ASP会话的生存期更长。因此,当登录时:1.)我有一个以烹饪为基础的第二节课。)我设置了几个会话变量
我的会话变量(2)在owin cookie会话变量之前“死亡”强制重新登录,这会导致整个应用程序中的意外行为。(Person登录,但没有真正登录)
更新3B
在深入研究之后,我在页面上看到了一些评论,其中说“Forms”身份验证超时和会话超时需要匹配。我认为正常情况下,两者是同步的,但无论出于什么原因,两者并不同步。
解决办法概述
1)始终先创建一个会话,然后再进行身份验证。基本上是在启动应用程序时创建会话。Session["Workaround"] = 0;
2)[实验性的]如果持久化cookie,请确保自己的超时/长度比web.config中的sessionTimeout长(在测试中)