Как работать с «Запомнить меня» в провайдере членства в Asp.Net - PullRequest
4 голосов
/ 25 июня 2010

Я написал собственного провайдера членства для моего веб-сайта ASP.Net.

Я использую перенаправление Forms.Authentication по умолчанию, в котором вы просто передаете true методу, чтобы сообщить ему «Запомнить меня» для текущего пользователя..

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

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

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

Буду признателен за руководство по обоим этим двум пунктам.Я собираюсь на секунду я могу что-то поместить в global.asax, чтобы перехватить аутентификацию?

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 16 октября 2012

Для меня решение было провести различие между браузер-сессией auth cookie (не путать с сессионным cookie asp.net) и persistent one - низкий срок действия создаст постоянный файл cookie, что означает, что он запоминается при закрытии и повторном открытии браузера в течение срока действия.У меня работает следующее:

public void SetAuthenticationCookie(LoginView loginModel)
    {
      if (!loginModel.RememberMe)
      {
        FormsAuthentication.SetAuthCookie(loginModel.Email, false);
        return;
      }
      const int timeout = 2880; // Timeout is in minutes, 525600 = 365 days; 1 day = 1440.
      var ticket = new FormsAuthenticationTicket(loginModel.Email, loginModel.RememberMe, timeout);
      //ticket.
      string encrypted = FormsAuthentication.Encrypt(ticket);
      var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted)
        {
          Expires = System.DateTime.Now.AddMinutes(timeout),
          HttpOnly = true
        };
      HttpContext.Current.Response.Cookies.Add(cookie);
    }
3 голосов
/ 25 июня 2010

FormsAuthentication и MembershipProviders - это две совершенно разные вещи, и все же они созданы для очень хорошей работы друг с другом.Если вы написали постоянный файл cookie [«Запомнить меня»], то в следующий раз вы можете просто позвонить Membership.GetUser(), который вернет вам экземпляр MembershipUser текущего пользователя, вошедшего в систему, или null, если пользователь не вошел в систему.

Таким образом, когда пользователь впервые приходит и аутентифицируется с помощью «Запомнить меня», вы должны написать постоянный файл cookie следующим образом.

FormsAuthentication.RedirectFromLoginPage(strUserName, true);

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

MembershipUser someUser = Membership.GetUser();
if(someUser == null)
{
    FormsAuthentication.SignOut();
    FormsAuthentication.RedirectToLoginPage();
}
else
{
    //Take where logged in users go.
}

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

РЕДАКТИРОВАТЬ

Есть два способа сделать это.

1.) Проверьте аутентификацию, как упомянуто выше в событии Session_Start в global.asax, и установите ключ сеанса, который станет доступным на всех страницах для этого конкретного сеанса.

2.) Другим способом является также сохранение общегообщий класс PageBase приложения, который наследуется от System.Web.UI.Page и действует как базовый класс страниц для всех ваших страниц asp.net.На странице Загрузка общего класса PageBase проверьте аутентификацию, как указано выше.В этом случае вам придется тщательно написать условное перенаправление, поскольку это может привести к бесконечному перенаправлению без конца, так как оно будет выполняться на Page_Load всей страницы из общего класса PageBase.

public class PageBase : System.Web.UI.Page
{
    /// <summary>
    /// Initializes a new instance of the Page class.
    /// </summary>
    public Page()
    {
        this.Load += new EventHandler(this.Page_Load);
    }


    private void Page_Load(object sender, EventArgs e)
    {
        try
        {
            AuthenticateUser();
        }
        catch
        {
            //handle the situation gracefully.
        }
    }

    private AuthenticateUser()
    {
        MembershipUser someUser = Membership.GetUser();
        if(someUser == null)
        {
            FormsAuthentication.SignOut();
            FormsAuthentication.RedirectToLoginPage();
        }
        else
        {
            //Take where logged in users go.
        }
    }
}

//in your asp.net page code-behind

public partial class contact : PageBase
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
}
...