Cookies не сохраняются между сеансами браузера в iOS Safari
у меня есть веб-сайт MVC 4, где пользователь может войти в систему, и я сохраняю cookie с информацией о сеансе, чтобы им не пришлось снова входить в систему.
public void SetCookie(HttpCookie cookie)
{
HttpContext.Current.Response.Cookies.Set(cookie);
}
это работает на настольных устройствах, но когда я запускаю это на iOS, он не работает 100% времени. Если я оставлю хотя бы 1 страницу открытой в мобильном браузере (Chrome или Safari) и вернусь на свой сайт, мой файл cookie сеанса будет найден, и мне не нужно входить в систему. Но если я закрою все окна этого браузера, то в следующий раз я перейдите обратно на мой сайт, файл cookie сеанса не найден. Я устанавливаю продолжительность/срок действия 1 года на моем cookie, чтобы он не истекал.
единственное, что я нашел до сих пор, это то, что это ошибка в .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)?
Это действительно беспокоило меня, так как большая часть трафика на мой сайт в ближайшие месяцы будет от мобильных пользователей, и я, вероятно, потеряю некоторые из них, если им придется каждый раз входить в систему (я знаю, что ненавижу входить в систему на мобильном устройстве...)
Edit:
Кстати-вот еще одна страница на ту же тему:Asp.Net проверка подлинности форм при использовании iPhone UIWebView
и я также попытался реализовать это, и это тоже не сработало:
http://www.bloggersworld.com/index.php/asp-net-forms-authentication-iphone-cookies/
и выше включает Скотт Хансельманс предложил исправить:
http://www.hanselman.com/blog/FormsAuthenticationOnASPNETSitesWithTheGoogleChromeBrowserOnIOS.aspx
вот мой код создания cookie, в случае, если он помогает:
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 сейчас, и это не имело никаких изменений в поведении.
один из комментаторов ниже предложил мне запустить Fiddler при доступе к веб-сайту с iPhone. После прохождения очень короткого и простые шаги, чтобы получить эту настройку, вот что я узнал.
первый запрос, который я попробовал, указал (Я считаю), в чем заключается реальная проблема. Когда я изучил этот первый запрос, iOS Safari отправляет заголовок DNT. Не имея понятия, что это было, я посмотрел его, и это заголовок "Не отслеживать".
затем я пошел и проверил настройки Safari, чтобы отключить это. Знаешь что, он уже выключен. Почему, черт возьми, Safari (iOS) отправляет заголовок DNT при настройке (настройки - > Safari - > не отслеживать) не установлен? Кроме того, блок Cookies, который находится прямо под ним, имеет значение "Никогда".
после разочарования этим, я пошел проверить Chrome для iOS, чтобы увидеть, если это все еще не работает. РАБОТАЕТ! Из того, что я могу сказать, я бы закрыл все вкладки, попробовал еще раз, закрыл все вкладки, затем убил браузер, и он все еще работает. Ура!
Теперь мне нужно выяснить, почему iOS Safari отправляет заголовок DNT...
2 ответов
Это ужасно смущает. Я узнал, что у меня был мой браузер Safari iOS в "частном режиме просмотра" в течение многих лет!
Я чувствую, что мое название должности "разработчик программного обеспечения" необходимо удалить на некоторое время. Жалко тратить время.
Я думаю, что вы ответили на свой вопрос с постоянным cookie. Обычные cookies истекают, когда заканчивается сеанс браузера (обычно это закрытие браузера). Постоянные cookies имеют дату, когда они должны быть удалены, и могут жить в сеансах браузера.
ваш код должен выглядеть примерно так:
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 будет сохраняться в сеансах браузера в течение одного года.