2010-10-18 1 views
13

Мне нужно, чтобы утилита для утилизации приложений была полностью прозрачной для пользователей моего веб-приложения.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> 
+2

Я думаю, что это может быть непонятно из вашего вопроса, но вы используете StateServer на том же компьютере/VM, что и веб-сервер? Потому что, если вы есть, я считаю, что StateServer полагается на IIS, таким образом, с помощью AppPool будет также сбрасывать StateServer. –

+0

Да, я запускаю это локально (на том же сервере, что и App Pool/IIS). – alan

+1

Я просто столкнулся с этим сообщением и подумал, что сделаю небольшую коррекцию в комментарии выше. StateServer - это отдельная служба Windows, поэтому она будет продолжать работать без потери данных состояния, даже если IIS будет полностью перезапущен. –

ответ

16

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

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

Configuring Forms Authentication (IIS 7) (Разветвление на каждой секции, связанной)

< Configuring Machine Keys in 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, тем самым вызывая необходимость повторной проверки подлинности.

+0

Большое спасибо. Только то, что мне было нужно. Хотя мне не нужно было добавлять конфигурацию модуля, о которой вы говорили, - только клавиши машины. –

+7

Если вы не укажете машинный ключ, случайный ключ, специфичный для пула приложений, автоматически генерируется при запуске пула. Когда пул перерабатывается, ключ регенерируется, делая все существующие файлы cookie недействительными. –

2

вы пробовали хранение сессий в базе данных, так что они являются постоянными, даже если процесс перерабатывается? see here for howto

+0

Да, я сначала попытался использовать SQL, а не местную государственную службу. Я получаю те же результаты. Я решил придерживаться государственной службы ASP.NET, пока не получу эти сеансы. Похоже, что сеанс получается через службу, но при утилизации AppPool все пользователи должны заходить в систему. – alan

+0

@Alan, SQL Server ** ** будет продолжать сеансы во всех повторах пула приложений. –

+0

@ Dan Я это понимаю. Проблема в том, что я не могу заставить его работать. Таким образом, я решил остаться с местной государственной службой ASP.NET (которая также будет сохраняться через переработку), поскольку это самый базовый подход. Если бы кто-нибудь мог любезно помочь мне в решении моих текущих задач, я бы очень признателен. – alan

2

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

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

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

Возможно, Ваш адрес web.config также будет полезен.

+0

Я возвращаюсь к SQL для обработки своих сеансов. Идентификатор сеанса сохраняется. Наверное, я ошибался в необходимости повторного входа в систему после повторного использования, чтобы повторная аутентификация. Теперь моя проблема заключается в том, что пользователю необходимо вернуться в систему после повторного использования. Есть идеи? – alan

+1

Это звучит как проблема с печеньем. Куки-файлы - это то, как пользователь снова возвращается. Отправьте файл web.config с помощью раздела auth. – rboarman

+0

@rboarman Я опубликовал состояние сеанса и сформировал разделы auth моей конфигурации. Пожалуйста, дайте мне знать, есть ли другие разделы, которые вы хотели бы видеть. – alan