Отмена аутентификации и перенаправление на страницу входа после аутентификации FormsAuthentication пользователя - PullRequest
1 голос
/ 02 декабря 2008

Мне нужно отозвать куки-файл аутентификации, если пользователь больше не существует (или какое-либо другое условие), после того как механизм аутентификации форм уже получил куки-файл аутентификации из браузера и проверил его. То есть Вот сценарий использования:

  1. Пользователь прошел проверку подлинности и получил неизменяемый файл cookie для аутентификации.
  2. Через несколько дней пользователь снова пытается получить доступ к моему веб-приложению, и, поскольку cookie действителен, механизм проверки подлинности форм предоставит доступ.

  3. Теперь я хочу выполнить вторую проверку (независимо от того, какое условие я хочу) и решить, хочу ли я разрешить пользователю продолжить или отменить аутентификацию.

Вопрос в том, существует ли официальный автоматизированный способ для этого? Пока что у меня есть некоторые возможности, но я не знаю, какая из них лучше. Я могу перехватить событие Authenticate в global.asax, проверить все, что я хочу, и отозвать, очистить cookie, а затем один из них:

  1. Перенаправить снова на тот же URL-адрес - это должно сработать, так как на этот раз аутентификация форм не удастся, и он будет перенаправлен на страницу входа.

  2. кинуть какое-то исключение ??? какой из них сделать перенаправление без указания чего-либо?

  3. Каким-то образом получить URL страницы входа в систему из файла конфигурации (какие-либо идеи, как / какой обработчик конфигурации использовать) и перенаправить напрямую?

  4. Какой-то класс / метод FormsAuthentication, который я пропустил, который предназначен для этого?

  5. Есть еще идеи?

Ответы [ 2 ]

3 голосов
/ 02 декабря 2008

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

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
                1, // Ticket version
                name, // Username associated with ticket
                DateTime.Now, // Date/time issued
                DateTime.Now.AddMonths(1), // Date/time to expire
                true, // "true" for a persistent user cookie
                DateTime.Now.ToUniversalTime(), // last time the users was checked
                FormsAuthentication.FormsCookiePath);// Path cookie valid for

        // Encrypt the cookie using the machine key for secure transport
        string hash = FormsAuthentication.Encrypt(ticket);
        HttpCookie cookie = new HttpCookie(
            FormsAuthentication.FormsCookieName, // Name of auth cookie
            hash); // Hashed ticket

        cookie.HttpOnly = true;

        // Set the cookie's expiration time to the tickets expiration time
        if (ticket.IsPersistent) cookie.Expires = ticket.Expiration;
        //cookie.Secure = FormsAuthentication.RequireSSL;
        Response.Cookies.Add(cookie);

Затем каждый раз, когда пользователь проходит аутентификацию, вы можете проверить дополнительную дату, которую вы передали в билет аутентификации, и с 10-минутными интервалами или менее дважды проверить базу данных, существует ли пользователь. Код может выглядеть примерно так:

public void FormsAuthentication_OnAuthenticate(object sender, 
                           FormsAuthenticationEventArgs args)
    {
        if (FormsAuthentication.CookiesSupported)
        {
            if (Request.Cookies[FormsAuthentication.FormsCookieName] != null)
            {
                try
                {
                    FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(
                      Request.Cookies[FormsAuthentication.FormsCookieName].Value);

                    DateTime lastCheckedTime = DateTime.TryParse(ticket.UserData);
                    TimeSpan elapsed = DateTime.Now - lastCheckedTime;
                    if (elapsed.TotalMinutes > 10)//Get 10 from the config
                    {
                        //Check if user exists in the database. 
                        if (CheckIfUserIsValid())
                        {
                            //Reset the last checked time
                            // and set the authentication cookie again
                        }
                        else
                        {
                            FormsAuthentication.SignOut();
                            FormsAuthentication.RedirectToLoginPage();
                            return;
                        }
                    }

                }
                catch (Exception e)
                {
                    // Decrypt method failed.
                }
            }
        }
    }

Вы даже можете кэшировать пользователей, которые были удалены за последние 10 минут, и сверяться с этой коллекцией.

Надеюсь, это поможет.

0 голосов
/ 02 декабря 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...