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 также будет полезна.