ASP.NET_SessionId+owin Cookies不发送到浏览器

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长(在测试中)



哔哔one
浏览 390回答 3
3回答

当年话下

我查看了owin和System.Web源代码。问题是System.Web有自己的Cookie信息的主源,而不是set-Cookie头。奥文只知道布景饼干头球的事。解决方法是确保owin设置的所有cookie也在HttpContext.Current.Response.Cookies收藏。我做了一个小中间件(来源, 努基特)就是这样做的,目的是将其放在cookie中间件注册之后。app.UseKentorOwinCookieSaver();app.UseCookieAuthentication(new CookieAuthenticationOptions());
打开App,查看更多内容
随时随地看视频慕课网APP