У меня есть веб-сайт MVC 4, где пользователь может войти в систему, и я сохраняю файл cookie с информацией о сеансе, поэтому им не нужно снова входить в систему.
public void SetCookie(HttpCookie cookie)
{
HttpContext.Current.Response.Cookies.Set(cookie);
}
Это работает на настольных устройствах, но когда я запускаю его на iOS, он не работает в 100% случаев. Если оставить в браузере мобильного телефона (Chrome или Safari) как минимум 1 страницу, а затем вернуться на мой сайт, будет найден мой файл 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:
Btw - вот еще одна страница на ту же тему: Аутентификация форм 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. Не уверен, что если это имеет значение, я сделаю больше исследований.
Update:
Прежде всего, PersistentCookie теперь имеет значение true, и это не изменило поведение.
Один из комментаторов ниже предположил, что я запускаю Fiddler при доступе к веб-сайту с iPhone. Пройдя очень короткие и легкие шаги, чтобы получить эту настройку, вот что я узнал.
Первый запрос, который я попробовал, указывал (я считаю), какова фактическая проблема. Когда я рассмотрел этот первый запрос, iOS Safari отправляет заголовок DNT. Не имея представления, что это было, я просмотрел его и заголовок "Не отслеживать".
Затем я пошел и проверил настройки Safari, чтобы отключить это. Угадай, что, он уже выключен. Почему, черт возьми, Safari (iOS) отправляет заголовок DNT, когда параметр (Настройки → Safari → Не отслеживать) не установлен? Кроме того, Block Cookies, который находится прямо под ним, установлен на "Никогда".
После того, как я разочаровался в этом, я пошел проверять Chrome на iOS, чтобы убедиться, что это все еще не работает. ОНО РАБОТАЕТ! Из того, что я могу сказать, я бы закрыл все вкладки, повторил попытку, закройте все вкладки, а затем убей браузер, и он все еще работает. Ура!
Теперь мне нужно выяснить, почему iOS Safari отправляет заголовок DNT...