MVC - пользователи должны повторно проверить подлинность в IIS Recycle

Мне нужно, чтобы утилита пула приложений была полностью прозрачной для пользователей моего веб-приложения.

В настоящее время при перезагрузке пула приложений IIS 7 все пользователи, входящие в мое веб-приложение, выгружаются и должны возвращаться (Context.User.Identity.IsAuthenticated устанавливается в false). Я использую SQL State Server, я использую проверку подлинности форм, и оба они настроены на использование файлов cookie. У меня создалось впечатление, что .NET и/или IIS обрабатывают аутентификацию файлов cookie.

Однако каждый раз, когда пул приложений перерабатывается, Context.User.Identity.IsAuthenticated устанавливается в false (и я понятия не имею, где это происходит), мои пользователи вышли из строя и должны войти в систему. Я могу видеть что идентификатор сеанса остается неизменным во всех входах, я также могу просмотреть эту информацию сеанса на сервере базы данных/состояния.

Я не могу сказать, является ли это сеансом или проблемой cookie.

Пожалуйста, помогите!

Метод входа в систему:

public ActionResult LogOn(string userName, string password, bool rememberMe, string returnUrl)
    {
        if (!ValidateLogOn(userName, password))
        {
            return View();
        }

        FormsAuth.SignIn(userName, true);  // uses FormsAuthentication.SetAuthCookie(username, true);
        Session["userName"] = userName;

        if (!String.IsNullOrEmpty(returnUrl))
        {
            return Redirect(returnUrl);
        }
        else
        {
            return RedirectToAction("Index", "Home");
        }
    }

Пользовательский атрибут контроллера:

public class CookieAuthorizeAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        HttpContext lvContext = HttpContext.Current;

            if (!lvContext.User.Identity.IsAuthenticated)
            {
                lvContext.Response.Redirect("~/Account/Logon");
            }
            else
            {
                FormsIdentity identity = (FormsIdentity)HttpContext.Current.User.Identity;
                FormsAuthentication.RenewTicketIfOld(identity.Ticket);
            }

        base.OnActionExecuting(filterContext);
    }
}

WebConfig:

<authentication mode="Forms">
  <forms cookieless="UseCookies" loginUrl="~/Account/LogOn" slidingExpiration="true" name=".ASPXAUTH" requireSSL="false" timeout="2880" />
</authentication>

<modules runAllManagedModulesForAllRequests="true">
  <remove name="ScriptModule" />
  <remove name="UrlRoutingModule" />
  <remove name="Session" />
  <remove name="FormsAuthentication" />
  <add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
  <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
  <add name="NHibernateMvcSessionModule" type="EpnNHibernateBase.NHibernateMvcSessionModule, EpnNHibernateBase" />
  <add name="Session" type="System.Web.SessionState.SessionStateModule" />
  <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" />
</modules>

Ответы

Ответ 1

Я смог найти решение самостоятельно. Проблема заключалась не в том, как аутентификация была обработана программно или как я аутентифицировал пользователей. Проблема заключалась в том, как я настроил аутентификацию в IIS/web.config.

Я внимательно следил за шагами в ссылках, перечисленных ниже:

Настройка проверки подлинности с помощью форм (IIS 7) (Разветвление в каждом связанном разделе)

Настройка машинных клавиш в IIS 7 < - Это, в частности,

После тщательного выполнения этих шагов я смог правильно сгенерировать машинный ключ. Эта машинная клавиша следующая (с сфабрикованным ключом):

<machineKey decryptionKey="ASDF3WS545AS5D4F8254A12DAFA5SDF7,IsolateApps" validation="3DES" validationKey="A65A6S5DF46ASD4F89WEF6SAD2F4A68EF4AW65F4D3A2F4AS6DF89A98D4F6A5SD4F6A5SDF46ASD8F4A6S5DF46AS5D4F6AS5DF49AS8DF46AS5D4F6AS5DF46SAD5F,IsolateApps" />

Кроме того, разделы httpModules и system.webServer:modules в web.config требовали добавления следующих модулей:

<remove name="Session" />
<remove name="FormsAuthentication" />
<add name="Session" type="System.Web.SessionState.SessionStateModule" />
<add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" />

Резюме. Из того, что я собираю, файлы cookie создавались и шифровались, но из-за отсутствия машинного ключа я не мог дешифровать файл cookie, тем самым вызывая необходимость повторной проверки подлинности.

Ответ 2

Вы пытались хранить сеансы в базе данных, чтобы они были постоянными, даже если процесс переработан? см. здесь.

Ответ 3

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

Как только пользователь войдет в систему, их состояние сеанса будет восстановлено, если вы используете SQL для его сохранения.

Чтобы отлаживать файлы cookie, вы можете использовать Fiddler или другие снифферы cookie.

Проводка вашего web.config также будет полезна.