Проверка подлинности с помощью форм / Cookie истекает слишком рано - PullRequest
0 голосов
/ 10 октября 2018

У меня проблема с файлом cookie, срок действия которого истекает слишком рано для веб-приложения ASP.Net.

Я установил срок действия файла cookie через 3 часа и не установил тайм-аут в веб-конфигурации, нопользователь перенаправляется на экран входа в систему через 1 час.

Если я установлю время истечения срока действия файла cookie на 1 минуту, он выйдет из системы через 1 минуту, поэтому я предполагаю, что что-то другое переопределяет его через час,но я не уверен, где искать.

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

<sessionState mode="InProc" timeout="525600" />
<authentication mode="Forms">
  <forms loginUrl="~/Login.aspx" name=".VRBAdmin" enableCrossAppRedirects="false" cookieless="UseCookies" />
</authentication>
<authorization>

protected void OnLogin(object sender, EventArgs e)
    {
        if (Membership.ValidateUser(this.uxUser.Text, this.uxPassword.Text))
        {
            string userData = string.Join("|", Roles.GetRolesForUser(this.uxUser.Text));

            FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
            1,                                     // ticket version
            this.uxUser.Text,                              // authenticated username
            DateTime.Now,                          // issueDate
            DateTime.Now.AddHours(3),               // expiryDate
            true,                                  // true to persist across browser sessions
            userData,                                  // can be used to store additional user data
            FormsAuthentication.FormsCookiePath);  // the path for the cookie

            // Encrypt the ticket using the machine key
            string encryptedTicket = FormsAuthentication.Encrypt(ticket);

            // Add the cookie to the request to save it
            HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
            cookie.HttpOnly = true;
            Response.Cookies.Add(cookie);

            // Your redirect logic
            Response.Redirect(FormsAuthentication.GetRedirectUrl(this.uxUser.Text, true));
        }
    }

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
    {
        HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
        if (authCookie != null)
        {
            //Extract the forms authentication cookie
            FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);

            // If caching roles in userData field then extract
            string[] roles = authTicket.UserData.Split(new char[] { '|' });

            // Create the IIdentity instance
            IIdentity id = new FormsIdentity(authTicket);

            // Create the IPrinciple instance
            IPrincipal principal = new GenericPrincipal(id, roles);

            // Set the context user 
            Context.User = principal;
        }
    }

1 Ответ

0 голосов
/ 11 октября 2018

Если вы используете ASP.NET Member Provider, вам не следует создавать FormsAuthenticationTicket самостоятельно.Вам даже не нужно вручную создавать principal объект внутри Application_AuthenticateRequest события.

Вместо этого вы хотите позволить провайдеру членства выполнять всю тяжелую работу.

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

<sessionState timeout="180" />
<authentication mode="Forms">
   <forms ...  timeout="360" />
</authentication>


protected void OnLogin(object sender, EventArgs e)
{
   if (Membership.ValidateUser(this.uxUser.Text, this.uxPassword.Text))
   {
       FormsAuthentication.SetAuthCookie(this.uxUser.Text, RememberMeSet);
       ...
   }
}

Также увеличивает время ожидания пула приложений , если вашему приложению не хватает трафика.

...