C# iOS Safari浏览器会话之间未保存cookie
我有一个MVC4网站,用户可以登录,我保存了一个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就会被找到,我不必
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);
}};
}