我一直在网上搜索,发现了许多奇怪的答案,我几乎尝试了所有这些答案。 我的问题是这个。我的登录页面包含:
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, userName, DateTime.Now, DateTime.Now.AddMinutes(min), persistCookie, userid.ToString());
string encTicket = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
cookie.Expires = ticket.Expiration;
Response.Cookies.Add(cookie);
FormsAuthentication.RedirectFromLoginPage(userName, persistCookie);
现在最小值是基于每个用户的,可以单独设置,因此是persistCookie。
根据我的理解,此代码应该导致覆盖web.config中的默认值的可能性。这应该是30分钟。
<authentication mode="Forms">
<forms loginUrl="~/Default/default.aspx" defaultUrl="~/User/UserMain.aspx"/>
</authentication>
min当前设置为120,并且persistCookie设置为太真。当我登录时,我会在30分钟时超时。 (不是会话,所以设置了某个到期日期,因为如果没有设置cookie应该是基于会话的,我也不会得到120分钟,这是一种交易)
我的问题是,为了简化它,我如何将值'min'作为cookie的到期日期?
这可能会变得很简单,但我现在完全陷入困境,所以任何帮助都会受到影响。
编辑: 我将登录逻辑更改为:
FormsAuthenticationTicket fat = new FormsAuthenticationTicket(1, userName, DateTime.Now, DateTime.Now.AddMinutes(min), persistCookie, userid.ToString());
string encTicket = FormsAuthentication.Encrypt(fat);
Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket) { Expires = fat.Expiration });
Response.Redirect(FormsAuthentication.GetRedirectUrl(userName, false));
现在它有效。但我似乎无法弄清楚为什么这会起作用,而不是前一个。 故障单创建是一样的,唯一的区别是我在创建HttpCookie时添加了HttpCookie的Expires属性,而不是在创建对象之后。
如果有人有一个很好的解释我都是耳朵! :)
答案 0 :(得分:6)
您的代码的问题在于您正在调用RedirectFromLoginPage
,这将创建表单身份验证Cookie,覆盖您刚刚创建的Cookie:
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
cookie.Expires = ticket.Expiration;
Response.Cookies.Add(cookie);
FormsAuthentication.RedirectFromLoginPage(userName, persistCookie); <-- creates a new cookie
由RedirectFromLoginPage
创建的cookie当然会从配置中获取默认超时。
你的第二个版本是要走的路。
答案 1 :(得分:2)
我认为您不了解Cookie过期和故障单过期日期之间的区别 - 即使存储的Cookie仍然有效,故障单也可视为已过期。 FormsAuthenticationTicket构造函数的第4个参数负责票证到期日期。
因此,要回答您的问题,您需要手动设置Cookie的过期日期或使其足够长,以超过您的身份验证票据的到期日期。