如何使用表单身份验证来提供保留登录功能?

问题描述:

我正在生成一个FormsAuthentication权证,并将其存储在一个cookie中,我使用MVC AuthorizeAttribute来提供授权。现在,我已经知道了,如果我有一个“保持登录状态”复选框选中,Cookie不会过期(我只是将cookie.expires更改为现在+ 1年,出于测试目的,已经检查了保持登录状态)。如何使用表单身份验证来提供保留登录功能?

但是,即使我设置cookie在创建票证时是持久性的,票据在超时期限后仍然停止工作。

下面的代码,我创建AuthTicket:

var now = DateTime.UtcNow.ToLocalTime(); 
FormsAuthenticationTicket authTicket = new System.Web.Security.FormsAuthenticationTicket(1, username, now, now.Add(FormsAuthentication.Timeout), rememberMe, username, FormsAuthentication.FormsCookiePath); 
string encryptedTicket = System.Web.Security.FormsAuthentication.Encrypt(authTicket); 
return encryptedTicket; 

这是我设置为一个cookie相同的encryptedTicket。任何人都知道我可以如何让这张票在FormsAuthentication超时之后被允许?我是否必须手动处理FormsAuthentication Timeout时间?

+0

你就不能使用'FormsAuthentication.SetAuthCookie'?你真的需要创建自己的?持久性cookie并不意味着它将永远持续,它将持续在浏览器会话之间。 – LukLed 2012-08-06 21:10:55

+0

我需要自己创建,因为我也可以从移动应用程序访问此日志,并且应用程序存储加密的故障单,并在获取数据时将其作为请求的一部分传入。 也许我刚刚误解了持久性对认证票的作用。它有什么作用吗? – 2012-08-06 21:29:19

Cookie粘附的时间量与登录保持有效的时间不同。基本上,持久性Cookie是'这个cookie在浏览器关闭后应该继续存在',并且独立于此登录有效期多长时间。您可以使用它来存储实例的用户名,以便用户在返回时不必重新输入此信息。

如果cookie有效,但登录已在cookie内过期,则需要重新登录。如果您希望您的登录时间更长,则需要延长web.config中<forms>标记的时间,或者您可以使用代码执行此操作,但如果要延长/缩短过期时间,则需要重新编译。

这里有一些网站解释远一点有关这些概念:

http://software-security.sans.org/blog/2012/04/05/forms-authentication-remember-me-its-hard-not-too

Cookie Confusion with FormsAuthentication.SetAuthCookie() Method

+0

哦,明白了。基本上,我只是误解了它做了什么。谢谢。你知道isPersistent是否对实际授权票据做任何事情,因为我自己处理了Cookie创建? – 2012-08-07 19:09:35

+0

不是我的理解。 isPersistent只影响作为auth票证容器的cookie。 – Tommy 2012-08-07 19:10:10