0

У нас есть онлайн-платформа оценки, построенная с MVC3. Он работает в IIS на одном выделенном сервере под управлением Windows Server 2012 R2, над которым мы имеем полный контроль. Недавно пользователи сообщают, что они «выходят из системы» во время оценок. Это проблема, так как многие наши оценки имеют временные ограничения и регистрируются в затратах времени пользователей.ASP.NET MVC3 Аутентификация форм Устаревшая досрочно

Я не смог повторить проблему во время тестирования, но подтвердил, консультируясь с нашими журналами, что за последние 2 месяца ~ 15-20% пользователей должны входить в систему в какой-то момент во время их оценки. За 10 месяцев до этого только < 2% пришлось заходить назад.

Я сравнил нашу текущую базу кода с тем, как это было 3 месяца назад, и ничего, что даже отдаленно связано с входом в систему и аутентификацией, было изменилось. Насколько мне известно, настройки на сервере не были изменены.

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

От Web.config:

<authentication mode="Forms"> 
    <forms loginUrl="~/Login/" timeout="300" slidingExpiration="true" /> 
</authentication> 

Это, как мы создаем аутентификации печенье:

Guid User_Id = /* lookup id with username after verification */ 
string User_Role = /* CSV specifying the roles the user has */ 
DateTime Expiry = DateTime.Now.AddHours(5); 
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, User_Id.ToString(), DateTime.Now, Expiry, false, User_Role, "/"); 
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(authTicket)); 
cookie.Expires = Expiry; 
HttpContext.Current.Response.Cookies.Add(cookie); 

Мы пользователь пользовательский реализация AuthorizeAttribute, чтобы ограничить доступ к большинству действий, как это:

public class MyController : Controller 
{ 
    [CustomAuthorize(Roles = "MyRole")] 
    public ActionResult MyAction() 
    { 
     // do some stuff 
     return View(); 
    } 
} 

Определяется следующим образом:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)] 
public class CustomAuthorizeAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     string cookieName = FormsAuthentication.FormsCookieName; 

     if (!filterContext.HttpContext.User.Identity.IsAuthenticated || 
      filterContext.HttpContext.Request.Cookies == null || 
      filterContext.HttpContext.Request.Cookies[cookieName] == null 
     ) 
     { 
      HandleUnauthorizedRequest(filterContext); 
      return; 
     } 

     var authCookie = filterContext.HttpContext.Request.Cookies[cookieName]; 
     var authTicket = FormsAuthentication.Decrypt(authCookie.Value); 
     string[] roles = authTicket.UserData.Split(','); 

     var userIdentity = new GenericIdentity(authTicket.Name); 
     var userPrincipal = new GenericPrincipal(userIdentity, roles); 

     filterContext.HttpContext.User = userPrincipal; 
     base.OnAuthorization(filterContext); 
    } 
} 

Это была установка за последние 3 года, и это были последние 2 месяца, которые были проблематичными. Как вы видите, файл cookie истекает через 5 часов после его создания. Пользователи, как правило, довольно расплывчаты в своих отчетах, и, глядя на наши журналы, количество времени между первоначальным входом и повторным входом в систему колеблется от где-то между несколькими минутами и несколькими часами. Даже я поглядела на сервере на то, что я думаю, соответствующие настройки и не может видеть любую вещь, которая может привести к возникновению проблемы:

IIS Settings

Единственное, что я могу думать о том, что может вызвать их «выходить из системы» будет означать, что cookie аутентификации истечет преждевременно (или, возможно, будет удален). Мы говорим о тысячах пользователей, от сотен компаний. Многие используют свои собственные ПК, а не те, которые предоставляются в результате работы. Если у кого-то есть какие-то идеи, я бы с удовольствием их услышал.

+0

Тот факт, что вы заменяете Identity и принцип в AuthorizeAttribute, вызывает подозрение. Я понимаю, что это, возможно, сработало хорошо раньше, но часто раз такие проблемы не появляются, пока что-то другое, часто совершенно не связанное, изменяется. –

ответ

0

Поскольку вы используете Response.Add, а не SetCookie, и вы определяете фиксированную дату истечения срока действия, которая делает файлы cookie постоянными, скорее всего, ваши пользователи иногда формируют файлы cookie, выпущенные дважды, если они заходят за эти пять часов дважды.

Я бы проверял, не путает ли это модуль auth. Одно из таких нескольких куки-файлов может истечь в какой-то момент времени, а скользящее окончание заставляет его переиздаваться. Это, возможно, открывает сценарий, в котором есть несколько файлов cookie в одном запросе, некоторые из них могут быть истекли.

Мой совет - использовать http-отладчик, чтобы проверить это, а затем заменить код thst, возможно, сделать дубликаты ваших файлов cookie.

Смежные вопросы