ASP.NET用户登录最佳做法
我想使用ASP.NET(MVC)创建登录系统。
在互联网上,我发现了一些不良示例,这些示例在Click事件中涉及SQL。其他信息指向ASP.NET内置成员资格提供程序。
但是,我想自己动手。我不想使用内置的成员资格提供程序,因为它似乎只能在MS SQL上运行,而且我不喜欢在数据库中包含一些外部表的想法。
我可能会想到一些东西,但是我需要一些正确方向的指点。它不一定是高安全性,而只是常规的常识性安全性。
我有几个直接的问题:
- 许多系统似乎将会话ID存储在用户表中。我想这是为了将会话绑定到用户以防止劫持。每次用户进入页面时都要检查吗?如果会话过期该怎么办?
- 散列,加盐,它有什么作用?我知道MD5哈希,并且我以前使用过它。但不要加盐。
- Cookie的最佳做法?
解决方案
我会避免整个问题,并使用openid。我们可以直接使用一个可用的库。
这是有关将其放置在适当位置的博客文章的链接
我不知道最佳做法,但我可以告诉你我该怎么做。它不是高科技安全性,但却可以完成工作。
我使用表单身份验证。我通过登录页面上的文本框收到使用ssl保护的密码。我使用该密码并对其进行哈希处理。 (哈希就像一种方式的加密,我们可以获取无法反转回密码的哈希码)。我将这个哈希值与数据库中的用户哈希值进行比较。如果哈希匹配,我将使用内置在身份验证处理中的asp.nets,该处理程序将为我处理cookie。
FormsAuthentication类具有可用于执行此操作的方法,例如SetAuthCookie和RedirectFromLogin。他们将设置cookie并将其标记为已认证。 asp.net使用的cookie是加密的。我不能说它的安全级别,但是它相当普遍。
在我的课堂上,我进行密码检查并使用formsauth来处理其余的内容:
if(SecurityHelper.LoginUser(txtUsername.Text, txtPassword.Text)) { FormsAuthentication.RedirectFromLoginPage(txtUsername.Text, true); }
我们可以使用ASP.NET基础结构实现自己的成员资格提供程序,请参阅MemberShipProvider类的MSDN文档。
内置提供程序运行良好。它确实可以与MySQL一起使用,尽管我发现它不如MS SQL版本简单。如果可以使用then do,它将节省工作时间。
如果我们需要使用另一个数据存储,那么我同意axel_c,如果我要自己滚动,那么我将根据MS规范编写一个成员资格提供程序。这将使我们之后的所有开发人员都可以更轻松地维护代码。
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(); }
我使用自己的用户对象和表。
我将散列的密码存储在用户表中,每个用户使用唯一的盐。
这是安全的,易于实现的,并且将适合设计。
数据库表将不会受到Microsoft的成员资格提供程序废话的污染。
盐化是一种将杂乱无章的字符串添加到正在散列的任何内容中的做法。假设" mySalt = abc123",我的密码是" passwd"。在PHP中,我将使用hashResult = md5(mySalt + password)
。
假设字符串被截获。我们尝试匹配字符串,但最终匹配乱码,因为密码在加密之前先添加了盐。只要记住,在整个应用程序中,用于盐的任何东西都必须是连续的。如果在存储之前先对密码加盐,则必须将散列的加盐密码与数据库进行比较。
如果我们不希望数据库中的.Net成员资格表仅在连接字符串中指定,则可以使用内置的SQL成员资格提供程序,并且可以设置专用的"用户访问"数据库。
提供程序模型的优势在于应用程序级别,代码与我们使用的特定身份验证存储区无关。
在asp.net网站上有一系列的tutirials:
连结文字