如何正确实现会话用户系统

时间:2011-01-27 16:28:27

标签: c# asp.net session membership

我之前从未真正实现过注册/登录系统,因此我正在尝试在C#/ ASP.NET中创建自己的系统(不使用ASP.NET的内置成员资格提供程序)。我有点不清楚的是如何利用Session / cookies来保持用户在会话期间和会话之间登录。

protected void Login_User(object sender, EventArgs e)
{
    string username = usernameField.Text;
    string password = passwordField.Text;
    User user = UserRepository.FindUser(username);
    if (user != null)
    {
        if (user.Password.Equals(Hash(password)))
        {
            // How do I properly login the user and keep track of his session?
        }
        else
            Response.Write("Wrong password!");
    }
    else 
        Response.Write("User does not exist!");
}

3 个答案:

答案 0 :(得分:0)

您可以使用RedirectFromLogin重定向到用户请求但由于身份验证而无法访问的页面,或者如果您想要控制用户重定向到的位置,可以使用SetAuthCookie < / p>

答案 1 :(得分:0)

对于正确的登录系统而言非常复杂。

  1. 创建继承System.Security.Principal.IPrincipal
  2. 的类
  3. 继承System.Security.Principal.IIdentity
  4. 的另一个类
  5. 将IPrincipal衍生物分配给System.Web.HttpConext.Current.User
  6. 如果你不想使用cookies,那么把你的IPrincipal放到Session。
  7. 如果HttpContext.Current.User丢失,则通过get从会话重新分配(在第一个事件中,例如page_init)。对于我的代码,我使用FormsAuthenticationTicket作为cookie并在事件PostAuthenticateRequest上重新分配Global.asax
  8. 使用HttpContext.Current.User的好处是你可以标记方法属性。

    [Authorize] // authorized user only
    public void btn_click(...){...}
    

    我不确定普通的asp.net,但它在asp MVC中运行得很好

    如果你想使用cookies,请尝试使用System.Web.Securitiy.FormsAuthenticationTicket和FormsAuthentication

    样品

    public class WebUser:System.Security.Principal.IPrincipal
    {
      ...
      public System.Security.Principal.IIdentity Identity{get; private set;}
      public WebUser(...)
      {
        this.Identity = new WebIdentity(...);
        HttpContext.Current.User = this;
      }
    }
    public class WebIdentity : System.Security.Principal.IIdentity
    {
      ...
    }
    
    public void Login(...)
    {
      var newUser = new WebUser(...);
    }
    

答案 2 :(得分:0)

使用此:

public class FormsAuthenticationService 
{
    public void SignIn(string userName, bool createPersistentCookie)
    {
        if (String.IsNullOrEmpty(userName)) throw new ArgumentException("Value cannot be null or empty.", "userName");

        FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);
    }

    public void SignOut()
    {
        FormsAuthentication.SignOut();
    }
}