ASP.NET MVC应用程序中的持久登录实现

时间:2011-01-25 12:31:52

标签: asp.net-mvc authentication login

我想实现ASP.NET MVC应用程序中解释为here的身份验证类型。 http://jaspan.com/improved_persistent_login_cookie_best_practice

我目前的实现是拥有Users和UserLoginTokens表:

CREATE TABLE [Users].[Users]
(
Id              int             NOT NULL, 
UserName        nvarchar(30)    NULL,   -- Not unique. Login by Email.
Email           nvarchar(100)   NOT NULL, 
PasswordHash    nvarchar(512)   NOT NULL,
PasswordSalt    nvarchar(512)   NOT NULL,
)
CREATE TABLE [Users].[UserLoginTokens]
(
Id          int             NOT NULL,
UserId      int             NOT NULL,
Token       varchar(16)     NOT NULL,
Series      varchar(16)     NOT NULL,
)

用户登录后,他发布了一个内容为t=@Token&s=@Series的用户cookie。

现在,我有PersistentLoginModule每次请求都会搜索此Cookie,验证令牌和系列是否有效从中构建用户。

我的问题:

  1. 为了实现这一点,最好是实现我自己的身份验证模块并且根本不使用FormsAuthentication吗?

  2. 我应该在每个请求中针对数据库验证令牌吗?

  3. 我应该何时丢弃旧令牌并向用户发放新令牌?

  4. 关于数据库的实现,如果我理解正确,对于给定的用户,系列总是相同的。如果是这样,也许我应该把它移到用户表?

  5. 谢谢,任何帮助都会非常感激!

1 个答案:

答案 0 :(得分:1)

如果您要构建自己的身份验证模块,我建议您仍然使用FormsAuthentication票证。

FormsAuthenticationTicket 类有一个UserData属性,可用于存储其他数据。

您可以使用静态 FormsAuthentication.Encrypt(故障单) FormsAuthentication.Decrypt(故障单)方法来存储和检索Cookie中的数据集。

NO。您不希望每次请求都转到数据库。您可能希望在某种会话变量中存储类似所提供证据的HASH(在您对数据库进行验证之后)。然后,您可以稍后重新计算HASH并将其与您在当前会话期间已经验证的值进行比较(以验证它是否未被篡改)。

您绝对应该对最佳做法和身份验证黑客进行研究。您链接的文章来自2006年。从那时起,网络安全性发生了很多变化。

检查FormsAuthenticationModule的源代码,了解Microsoft实现的工作原理(使用反射器之类的东西)。您还应确保已安装此KB修补程序http://support.microsoft.com/kb/2416472