我想实现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,验证令牌和系列是否有效从中构建用户。
我的问题:
为了实现这一点,最好是实现我自己的身份验证模块并且根本不使用FormsAuthentication吗?
我应该在每个请求中针对数据库验证令牌吗?
我应该何时丢弃旧令牌并向用户发放新令牌?
关于数据库的实现,如果我理解正确,对于给定的用户,系列总是相同的。如果是这样,也许我应该把它移到用户表?
谢谢,任何帮助都会非常感激!
答案 0 :(得分:1)
如果您要构建自己的身份验证模块,我建议您仍然使用FormsAuthentication票证。
FormsAuthenticationTicket 类有一个UserData属性,可用于存储其他数据。
您可以使用静态 FormsAuthentication.Encrypt(故障单)和 FormsAuthentication.Decrypt(故障单)方法来存储和检索Cookie中的数据集。
NO。您不希望每次请求都转到数据库。您可能希望在某种会话变量中存储类似所提供证据的HASH(在您对数据库进行验证之后)。然后,您可以稍后重新计算HASH并将其与您在当前会话期间已经验证的值进行比较(以验证它是否未被篡改)。
您绝对应该对最佳做法和身份验证黑客进行研究。您链接的文章来自2006年。从那时起,网络安全性发生了很多变化。
检查FormsAuthenticationModule的源代码,了解Microsoft实现的工作原理(使用反射器之类的东西)。您还应确保已安装此KB修补程序http://support.microsoft.com/kb/2416472