Мне нужно, чтобы утилита для утилизации приложений была полностью прозрачной для пользователей моего веб-приложения.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>
Я думаю, что это может быть непонятно из вашего вопроса, но вы используете StateServer на том же компьютере/VM, что и веб-сервер? Потому что, если вы есть, я считаю, что StateServer полагается на IIS, таким образом, с помощью AppPool будет также сбрасывать StateServer. –
Да, я запускаю это локально (на том же сервере, что и App Pool/IIS). – alan
Я просто столкнулся с этим сообщением и подумал, что сделаю небольшую коррекцию в комментарии выше. StateServer - это отдельная служба Windows, поэтому она будет продолжать работать без потери данных состояния, даже если IIS будет полностью перезапущен. –