MVC - пользователи должны повторно пройти аутентификацию на IIS Recycle - PullRequest
14 голосов
/ 18 октября 2010

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

В настоящее время после перезапуска пула приложений 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>

Ответы [ 3 ]

16 голосов
/ 23 ноября 2010

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

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

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

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

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

<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 голосов
/ 18 ноября 2010

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

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

Для отладки кукиВы можете использовать Fiddler или другие анализаторы файлов cookie.

Также было бы полезно опубликовать свой файл web.config.

2 голосов
/ 18 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...