在iOS Safari浏览器会话之间不保存Cookie

我有一个MVC 4网站,用户可以login,我用他们的会话信息保存一个cookie,所以他们不必再次login。

public void SetCookie(HttpCookie cookie) { HttpContext.Current.Response.Cookies.Set(cookie); } 

这在桌面设备上工作,但是当我在iOS上运行这个,它不能100%的时间工作。 如果我在移动浏览器(Chrome或Safari)中至less保留1个页面,并导航回我的网站,我的会话cookie被find,我不必login。 但是,如果我closures该浏览器的所有窗口,那么下一次导航回我的网站时,会话cookie不会被发现。 我在我的Cookie上设置了1年的期限/到期时间,因此不会过期。

到目前为止我发现的唯一的事情是,这是.NET 4.0中的一个错误,在.NET 4.5中已经修复。 我相信我已经在运行.NET 4.5,通过查看我的* .csproj和TargetFrameworkVersion元素:

 <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> <PropertyGroup> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> <ProductVersion> </ProductVersion> <SchemaVersion>2.0</SchemaVersion> <ProjectGuid>{xxxxxxxxxxxxxxxxxx}</ProjectGuid> <ProjectTypeGuids>{xxxxxxxx};{xxxxxxxxxxxxx};{xxxxxxxxxxxxxxxx}</ProjectTypeGuids> <OutputType>Library</OutputType> <AppDesignerFolder>Properties</AppDesignerFolder> <RootNamespace>MyApp</RootNamespace> <AssemblyName>MyApp</AssemblyName> <TargetFrameworkVersion>v4.5</TargetFrameworkVersion> <MvcBuildViews>false</MvcBuildViews> <UseIISExpress>true</UseIISExpress> <IISExpressSSLPort /> <IISExpressAnonymousAuthentication /> <IISExpressWindowsAuthentication /> <IISExpressUseClassicPipelineMode /> </PropertyGroup> 

这是与.NET(或MVC)的错误,还是我的编码? 我是否需要升级到MVC 5(而不是升级到.NET 4.5的原始build议)?

这真的让我感到不安,因为在接下来的几个月里,我的网站大多数stream量都是来自移动用户,如果他们必须每次都logging下来,我可能会失去其中一些(我知道我讨厌不得不在移动设备上login…)

编辑:

顺便说一句 – 这是另一个相同主题的页面: 使用iPhone UIWebView的Asp.Net窗体身份validation

而且我也试着实现这个,也没有工作:

ASP.Net Forms Authentication, Safari/Chrome on iPhone and Persistent Cookies

以上包括斯科特Hanselmansbuild议修复:

http://www.hanselman.com/blog/FormsAuthenticationOnASPNETSitesWithTheGoogleChromeBrowserOnIOS.aspx

这是我的cookie创build代码,以防万一:

 private void CreateAndSetAuthenticationCookie(int loginId, string username) { HttpCookie cookie = CreateAuthenticationCookie(loginId, username); _cookieService.SetCookie(cookie); } private HttpCookie CreateAuthenticationCookie(int loginId, string username) { string userData = string.Format("loginId:{0},username:{1}", loginId, username); var ticket = new FormsAuthenticationTicket(loginId, username, DateTime.Now, DateTime.Now.AddYears(1), false, userData, FormsAuthentication.FormsCookiePath); string encryptedTicket = FormsAuthentication.Encrypt(ticket); return new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket); } 

有一点我在我的评论中指出,我把“PersistentCookie”设置为false ….不知道这是否有所作为,我会做更多的研究。

更新:

首先,PersistentCookie现在被设置为true,而且行为没有任何变化。

其中一位评论员build议我在从iPhone访问网站的同时运行Fiddler。 通过简单而简单的步骤来获得设置,这是我发现的。

我试过的第一个要求指出(我相信)实际的问题是什么。 当我查看第一个请求时,iOS Safari正在发送一个DNT头。 不知道那是什么,我查了一下,这是一个“不跟踪”标题。

接下来,我去了,检查我的Safari设置closures。 猜猜看,它已经closures了。 为什么Safari(iOS)在设置(设置 – > Safari – >不跟踪)设置没有设置时发送DNT头? 此外,正下方的块Cookie被设置为“从不”。

在感到沮丧之后,我去检查了iOS的Chrome浏览器,看看是否仍然无法正常工作。 有用! 从我所知道的,我会closures所有的标签,再试一次,closures所有标签,然后杀死浏览器,它仍然工作。 万岁!

现在,我需要弄清楚为什么iOS Safari发送DNT头…

这是可怕的尴尬。 我发现我的iOS Safari浏览器在“隐私浏览模式”下已经有了!

我觉得我的“软件开发人员”职位需要一段时间去除。 对不起浪费大家的时间

我认为你用持久cookie来回答你自己的问题。 浏览器会话结束时(通常是closures浏览器),定期的cookies会过期。 持久性cookie有一个date,应该被删除,并可以跨浏览器会话。

你的代码应该是这样的:

 private HttpCookie CreateAuthenticationCookie(int loginId, string username) { string userData = string.Format("loginId:{0},username:{1}", loginId, username); var ticket = new FormsAuthenticationTicket(loginId, username, DateTime.Now, DateTime.Now.AddYears(1), false, userData, FormsAuthentication.FormsCookiePath); string encryptedTicket = FormsAuthentication.Encrypt(ticket); return new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket){{ Expires = DateTime.Now.AddYears(1); }}; } 

这样,您的Cookie将在浏览器会话中持续一年。