我想添加一个"让我登录"我的自定义登录控件的选项。
这就是我目前使用会话的方式:
我手动保存并从HttpContext.Current.Session["key"]
读取值。工作正常。
web.config的相关部分:
<sessionState mode="StateServer" useHostingIdentity="true" cookieless="false" timeout="120" stateConnectionString="tcpip=127.0.0.1:42424" />
<authentication mode="Forms">
<forms loginUrl="/login" name="AuthCookie" timeout="120" slidingExpiration="true" path="/" />
</authentication>
<authorization>
<allow users="*" />
</authorization>
如您所见,会话的默认持续时间为120分钟。
&#34;退出&#34;:
Session.Clear();
Session.Abandon();
通过带有文本框的自定义登录控件,我授予对成员区域的访问权限。 (我不会使用System.Web.Security.FormsAuthentication
)
输入有效凭据和选中复选框后,请继续登录&#34;,我希望将已经激活的会话的持续时间增加到约30天。
到目前为止,我找到了像
这样的解决方案FormsAuthenticationTicket fat = new FormsAuthenticationTicket(1, "username", DateTime.Now, DateTime.Now.AddMinutes(1), false, "username");
string encTicket = FormsAuthentication.Encrypt(fat);
Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket) { Expires = fat.Expiration });
哪个不起作用,因为System.Web.Security.FormsAuthentication.Timeout仍然是120分钟。 设置
也是如此Session.Timeout = 666;
有什么建议吗?
答案 0 :(得分:2)
你无法以这种方式真正接近它。你不能坚持几天的会议 - 它只是不能很好地扩展。
大多数人所做的是提供自动登录的方法,这样当他们的会话到期时,他们会在下一次操作/重新加载时无缝地重新登录。大多数人使用包含唯一哈希的cookie来执行此操作,该哈希值在服务器上进行检查。如果您希望此人登录30天,您只需将Cookie设置为在30天后过期。
答案 1 :(得分:2)
我决定简要总结一下我是怎么做到的,因为@David Haney让我:
我在usertable中添加了一个列,其中包含一个GUID,用于“重新进入”/再次提供凭据。该GUID在登录时创建并存储在数据库中。 它还存储为cookie中的ecrypted值。 (我的网站不使用SSL)
添加到登录例程(如果用户选中了“记住我”复选框):
HttpCookie aCookie = new HttpCookie("Session");
Guid sessionGuid = // Buisiness layer call to generate value
String sessionID = sessionGuid.ToString();
aCookie.Value = Helper.Protect(sessionID, "sessionID");
aCookie.Expires = DateTime.Now.AddDays(30);
Response.Cookies.Add(aCookie);
从这里使用Helper.Protect和Helper.Unprotect How to use MachineKey.Protect for a cookie?将加密的MAC签名值存储在cookie中。
通过让每个内容页继承自一个实现该逻辑并继承自System.Web.UI.Page
的类来完成重新缓存。
public class BasePage : System.Web.UI.Page
{
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
if (Request.Cookies["Session"] != null && !CustomIsLoggedInCheckMethod)
{
String unprotected = Helper.Unprotect(Request.Cookies["Session"].Value, "sessionID");
Guid sessionID = Guid.Parse(unprotected);
// Calls to buisiness layer to get the user, set sessions values et cetera
}
}
}
如果用户在上次会话后被禁止或退出,则Cookie值到期日期将设置为过去的日期:
HttpCookie myCookie = new HttpCookie("Session");
myCookie.Expires = DateTime.Now.AddDays(-1d);
Response.Cookies.Add(myCookie);
修改强>:
啊,我忘了提这个。我还添加了一个通知栏,告诉用户他已经重新登录。它基于http://blog.grio.com/2012/11/a-copypaste-ble-jquery-notification-bar.html
见Demo