ASP.NET用户登录最佳实践

时间:2008-09-30 10:07:40

标签: asp.net asp.net-mvc

我想使用ASP.NET(MVC)创建一个登录系统。

在互联网上,我发现了一些在Click事件中涉及SQL的坏例子。其他信息指向ASP.NET内置成员资格提供程序。

但是,我想自己动手。我不想使用内置的成员资格提供程序,因为它似乎只适用于MS SQL,我不喜欢在我的数据库中有一些外表的想法。

我可能会想到一些事情,但我需要在正确的方向上指点几点。它不一定是高安全性,而只是常规的常识性安全性。

我有几个直接的问题:

  1. 许多系统似乎都将会话ID存储在用户表中。我想这是为了防止劫持,将会话绑定到用户。每次用户进入页面时都要检查一下吗?如果会话到期我该怎么办?

  2. 哈希,腌制,它做了什么?我知道MD5哈希,我以前用过它。但不是腌制。

  3. Cookie的最佳做法?

7 个答案:

答案 0 :(得分:5)

我不了解最佳做法,但我可以告诉你我做了什么。它不是高级安全,但它确实起到了作用。

我使用表单身份验证。我通过登录页面上的文本框收到使用ssl保护的密码。我拿了那个密码并哈希吧。 (散列就像单向加密,你可以得到无法反转回密码的哈希码)。我将该哈希值与数据库中的用户哈希值进行比较。如果哈希的匹配,我使用在身份验证处理中构建的asp.nets,它为我处理cookie。

FormsAuthentication类具有可用于执行此操作的方法,例如SetAuthCookie和RedirectFromLogin。他们将设置cookie并将其标记为已通过身份验证。 asp.net使用的cookie是加密的。我不能说它的安全级别,但它的使用相当普遍。

在我的课堂上,我会进行密码检查并使用formauth来处理其余部分:

if(SecurityHelper.LoginUser(txtUsername.Text, txtPassword.Text))
{    
    FormsAuthentication.RedirectFromLoginPage(txtUsername.Text, true);
}

答案 1 :(得分:2)

您可以使用ASP.NET基础结构实现自己的成员资格提供程序,请参阅MSDN docs for MemberShipProvider class

答案 2 :(得分:2)

内置提供商运作良好。它确实可以与MySQL一起使用,虽然我发现它不像MS SQL版本那么直接。如果你可以使用那么做,它将节省你的工作时间。

如果你需要使用另一个数据存储,那么我同意axel_c,如果我要自己滚动,那么我会根据MS规范编写一个会员提供者。它将使代码对于跟随您的任何开发人员更易于维护。

答案 3 :(得分:2)

Salting是将一个unqiue字符串添加到正在散列的任何字符串的做法。假设mySalt = abc123,我的密码为passwd。在PHP中,我会使用hashResult = md5(mySalt + password)

假设字符串被截获。您尝试匹配字符串,但最终匹配乱码,因为密码在加密之前已被加盐。请记住,无论你使用什么盐,都必须在整个应用过程中保持连续。如果在存储之前加密密码,则必须将散列的加密密码与数据库进行比较。

答案 4 :(得分:1)

您可以使用内置的SQL成员资格提供程序 - 如果您不想在数据库中使用.Net成员资格表,则可以设置专用的“用户访问”数据库 - 只需在连接字符串中指定。

提供者模型的优势在于应用程序级别,代码与您使用的特定身份验证存储无关。

asp.net网站上有一系列很好的tutirials:

link text

答案 5 :(得分:-1)

我会避免整个问题并使用openid。有一个可以直接使用的库。 Here is a link to a blog post about putting this in place

答案 6 :(得分:-1)

microsoft的成员资格提供程序的一个缺点是你不能在域驱动的方法中使用它。如果您愿意,可以使用自己的密码哈希创建自己的用户对象,并仍然使用Microsoft提供的身份验证cookie。使用这些身份验证cookie意味着您不必自己管理会话ID。

public void SignIn(User user)
        {
            FormsAuthentication.SignOut();
           var ticket = new FormsAuthenticationTicket(1, user.UserName, DateTime.Now.AddMinutes(30), expires, alse, null);
            var encryptedTicket = FormsAuthentication.Encrypt(ticket);
            var authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket)
            {
                Expires = ticket.Expiration
            };

            httpContextProvider.GetCurrentHttpContext().Response.Cookies.Add(authCookie);
        }

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

我使用自己的用户对象和表格。 我将密码存储在usertable中,每个用户使用一个唯一的salt。 这是安全的,易于实施,适合您的设计。 您的数据库表不会受到微软成员资格提供者废话的污染。