我有一个Web服务器:
Windows Server 2008 R2 X64
IIS版本:7.5.7600.16385
(By this link我们已检查)我们机器上安装的.net是:4.7(460805)
我们的网站是在.net 4.7和MVC 5上开发的,我们使用ASP.NET Forms身份验证来验证我们的客户。
在加载登录页面时,我们编写了一个简单的测试cookie:
HttpCookie cookie = new HttpCookie("test", "123");
cookie.Expires = DateTime.UtcNow.AddYears(1);
Response.Cookies.Add(cookie);
当用户点击登录按钮时,我们读取该cookie并计算所有cookie:
if (Request.Cookies["test"] == null)
{
if (Request.Cookies.Count > 0)
{
for(int i=0;i< Request.Cookies.Count;i++)
Loger.PointLoger.LogIt("Cookies:" +
Request.Cookies[i].Name
+" Value: "+ Request.Cookies[i].Value);
}
HttpBrowserCapabilitiesBase bc = Request.Browser;
...//Some codes to log
}
通过这种方式,我们可以确定,编写cookie是可以启用的,我们可以编写我们的身份验证cookie。如果我们无法读取该测试cookie,我们会将用户重定向到另一个页面....
我们的一些用户报告说,他们无法登录我们的网站,我们的服务器日志显示我们无法在他们的设备上编写cookie,重要的是在他们的设备上启用写入cookie。
在做了一些测试之后,我们发现编写cookie是随机的或类似的东西,有一次可以,而另一次则没有。
通过此代码,我们收集了一些用户的信息:
HttpBrowserCapabilitiesBase bc = Request.Browser;
...
"IsMobileDevice:" + bc.IsMobileDevice
"-Browser:" + bc.Browser
...
例如:
Cookies.Count: 2
Cookies:_ga Value: GA1.2.163980100.1507000247
Cookies:_gid Value: GA1.2.1373100693.1518900032
IsMobileDevice:True
-Browser:Chrome
-Beta:False
-Platform:Unknown
-Type:Chrome47
-Version:47.0
-MobileDeviceModel:Unknown
-MobileDeviceManufacturer:Unknown
-GatewayMajorVersion:0
-MinorVersion:0
-MinorVersionString:0
-MajorVersion:47
-GatewayVersion:None
-Id:chrome
-HasBackButton:True
-Cookies:True
-ClrVersion: 0.0
-InputType:keyboard
乳清这些饼干(_gid和_ga)已经写好但我们的测试饼干没有?
我读了一些帖子,如:
Asp.Net Forms Authentication when using iPhone UIWebView
ASP MVC Cookies not persisting
C# Login code not work on safari
Strange problem with cookies in Safari and Asp.net
现在问题是:是否在.NET 7上出现问题?如果是什么解决方案?
我在这里通过了我们项目的一些代码,并且由于安全性,我用“.....”代替了一些代码:
在Web.config上:
<authentication mode="Forms">
<forms domain=".mysite.com" name="abc" cookieless="UseCookies"
enableCrossAppRedirects="true" loginUrl="/Accounts/Login"
timeout="2880" requireSSL="false" path="/" />
</authentication>
<machineKey compatibilityMode="Framework45" validationKey="C121487......"
decryptionKey="7E43716E4C97....." validation="SHA1" decryption="AES" />
<sessionState mode="InProc" customProvider="DefaultSessionProvider" cookieless="UseCookies" cookieName="debnf">
<providers>
<add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf38...." connectionStringName="DefaultConnection" />
</providers>
</sessionState>
在App_Browsers中:
<browsers>
<browser refID="Default">
<capabilities>
<capability name="cookies" value="true" />
</capabilities>
</browser>
</browsers>
更新:
这是我的主要代码:
我在这里写这个测试cookie
public ActionResult Login()
{
HttpCookie cookie = new HttpCookie("test", "123");
cookie.Expires = DateTime.UtcNow.AddHours(1);
Response.Cookies.Add(cookie);
return View();
}
当用户点击登录时,我在这里检查该cookie:
[HttpPost]
public ActionResult Login(LoginModel loginModel)
{
if (Request.Cookies["test"] == null)
{
.....
}
}