Файлы cookie не сохраняются между сеансами браузера в iOS Safari

У меня есть веб-сайт MVC 4, где пользователь может войти в систему, и я сохраняю cookie с информацией о его сеансе, чтобы им не приходилось снова входить в систему.

public void SetCookie(HttpCookie cookie)
{
    HttpContext.Current.Response.Cookies.Set(cookie);
}

Это работает на настольных устройствах, но когда я запускаю это на iOS, это не работает 100% времени. Если я оставлю хотя бы одну страницу открытой в мобильном браузере (Chrome или Safari) и вернусь на свой сайт, мой файл cookie сеанса будет найден, и мне не нужно будет входить в систему. Но если я закрою ВСЕ окна этого браузера, то в следующий раз, когда я вернусь на свой сайт, сессионный cookie не будет найден. Я устанавливаю срок действия / истечение срока действия cookie на 1 год, чтобы он не истек.

Единственное, что я нашел на данный момент, это то, что это ошибка в .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)?

Это действительно беспокоило меня, так как большая часть трафика на мой сайт в ближайшие месяцы будет приходиться на мобильных пользователей, и я, вероятно, потеряю некоторые из них, если им придется продолжать входить в систему каждый раз (я знаю, что я ненавижу войти на мобильное устройство ...)

Редактировать:

Кстати, вот еще одна страница на ту же тему:Проверка подлинности Asp.Net Forms при использовании 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 -> Не отслеживать) не установлена? Кроме того, Block Cookies, который находится прямо под ним, установлен на «Никогда».

Разочаровавшись в этом, я пошел проверить Chrome для iOS, чтобы убедиться, что это все еще не работает. ОНО РАБОТАЕТ! Из того, что я могу сказать, я бы закрыл все вкладки, попытался бы снова закрыть все вкладки, затем убил бы браузер, и он все еще работает. Ура!

Теперь мне нужно выяснить, почему iOS Safari отправляет заголовок DNT ...

Ответы на вопрос(2)

Ваш ответ на вопрос