C# iOS Safari浏览器会话之间未保存cookie

C# iOS Safari浏览器会话之间未保存cookie,c#,ios,asp.net-mvc,session,cookies,C#,Ios,Asp.net Mvc,Session,Cookies,我有一个MVC4网站,用户可以登录,我保存了一个cookie和他们的会话信息,这样他们就不必再次登录 public void SetCookie(HttpCookie cookie) { HttpContext.Current.Response.Cookies.Set(cookie); } 这可以在桌面设备上使用,但当我在iOS上运行它时,它不会100%的工作。如果我在移动浏览器(Chrome或Safari)中打开至少一个页面,然后导航回我的站点,我的会话cookie就会被找到,我不必

我有一个MVC4网站,用户可以登录,我保存了一个cookie和他们的会话信息,这样他们就不必再次登录

public void SetCookie(HttpCookie cookie)
{
    HttpContext.Current.Response.Cookies.Set(cookie);
}
这可以在桌面设备上使用,但当我在iOS上运行它时,它不会100%的工作。如果我在移动浏览器(Chrome或Safari)中打开至少一个页面,然后导航回我的站点,我的会话cookie就会被找到,我不必登录。但是,如果我关闭该浏览器的所有窗口,那么下次导航回我的站点时,将找不到会话cookie。我在我的cookie上设置了1年的持续时间/到期时间,这样它就不会过期

到目前为止,我唯一发现的是,这是.NET4.0中的一个bug,在.NET4.5中得到了修复。通过查看我的*.csproj和TargetFrameworkVersion元素,我相信我已经在运行.NET 4.5了:

<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>
我在评论中指出的一件事是,我将“PersistentCookie”设置为false……不确定这是否会产生影响,我会做更多的研究

更新:

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

下面的一位评论员建议我在从iPhone访问网站时运行Fiddler。在经历了获得该设置的非常简单的步骤之后,我发现了以下内容

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

接下来,我去检查我的Safari设置以关闭它。你猜怎么着,已经关了。为什么Safari(iOS)在未设置设置(设置->Safari->不跟踪)时发送DNT头?此外,块cookie(位于其正下方)被设置为“从不”

在对此感到沮丧之后,我去检查了Chrome的iOS版,看看这是否仍然不起作用。它起作用了!据我所知,我会关闭所有选项卡,再试一次,关闭所有选项卡,然后关闭浏览器,它仍然可以工作。万岁


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

我想你用持久cookie回答了你自己的问题。常规Cookie在浏览器会话结束时过期(这通常是关闭浏览器)。持久性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){{
         Expires = DateTime.Now.AddYears(1);
    }};
}

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

这让人非常尴尬。我发现我的iOS Safari浏览器已经处于“私人浏览模式”多年了


我觉得我的“软件开发人员”职位需要暂时取消。很抱歉浪费了大家的时间。

哇,两周后,我终于发现了这个:但我太累了,今晚不能尝试这个……我很快就会尝试。呃,那是不可能的……Bueller???只是猜测,但你用iframe吗?苹果设备不喜欢第三方cookie,这可能是个问题。让我们从一些基本的调试开始。。。cookie是否真的消失了,还是被发送到服务器,而服务器出于某种原因忽略了它?查看HTTP通信量,以准确了解在网络上来回传输的内容。用提琴。如果您按照这些说明操作,fiddler会让您查看手机和Internet之间的所有HTTP/HTTPS流量我已经尝试过了(我的评论是“不,没关系”)。我可以试着把所有的东西都放在同一个方法中,看看这是否有区别…(我的版本在一个方法中有标签,在另一个方法中有cookie)使用类似firebug/chrome开发工具的东西,你能向客户展示你的cookie是什么样子吗?我对这个答案投赞成票,但不接受,因为这只是修复了iOS chrome,不是狩猎。诚实和谦虚,伟大的性格可能不像你想象的那样令人尴尬。乍一看有点难说,每个人都会这样。如果有人说没有,他们实际上没有做任何工作。我在Express和iOS中设置cookies时也有同样的问题。在私有模式下,Safari会为每个新选项卡清除Cookie!希望这对任何人都有帮助。我的老板已经在私人模式下使用Safari至少一年了,他抱怨网站工作不正常。。。谢谢你的回答!
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);
    }};
}