【发布时间】:2010-10-05 13:32:28
【问题描述】:
我有一个标准的 ASP.NET MVC(RC 刷新)Web 项目,其中包含标准的 ASP.NET 成员资格提供程序和项目模板中包含的帐户控制器。
当我在登录表单中选中“记住我”时,网站仍然没有记住我。 (Firefox 会记住我的用户名和密码,但我希望会自动登录)。
我必须手动设置和检查 cookie 吗?如果是,应该怎么做最好?
【问题讨论】:
标签: .net asp.net-mvc cookies membership
我有一个标准的 ASP.NET MVC(RC 刷新)Web 项目,其中包含标准的 ASP.NET 成员资格提供程序和项目模板中包含的帐户控制器。
当我在登录表单中选中“记住我”时,网站仍然没有记住我。 (Firefox 会记住我的用户名和密码,但我希望会自动登录)。
我必须手动设置和检查 cookie 吗?如果是,应该怎么做最好?
【问题讨论】:
标签: .net asp.net-mvc cookies membership
您需要将 true/false 传递给 SetAuthCookie 方法。
public ActionResult Login (string email, string password, bool rememberMe, string returnUrl)
{
// snip
FormsAuth.SetAuthCookie(username, rememberMe); // <- true/false
// snip
}
并确保bool rememberMe 反映了您登录页面上复选框的状态。
【讨论】:
您需要在Controll方法中生成持久cookie,当检查记住ME框时处理登录时。如果您使用的是RedirectFromLoginPage,请将createPersistentCookie 参数设置为true。
【讨论】:
这 3 种方法帮助我持久化 cookie。
注意,如果用户取消选择“记住我”,您将需要删除 cookie。
private const string RememberMeCookieName = "MyCookieName";
private string CheckForCookieUserName()
{
string returnValue = string.Empty;
HttpCookie rememberMeUserNameCookie = Request.Cookies.Get(RememberMeCookieName);
if (null != rememberMeUserNameCookie)
{
/* Note, the browser only sends the name/value to the webserver, and not the expiration date */
returnValue = rememberMeUserNameCookie.Value;
}
return returnValue;
}
private void CreateRememberMeCookie(string userName)
{
HttpCookie rememberMeCookie = new HttpCookie(RememberMeCookieName, userName);
rememberMeCookie.Expires = DateTime.MaxValue;
Response.SetCookie(rememberMeCookie);
}
private void RemoveRememberMeCookie()
{
/* k1ll the cookie ! */
HttpCookie rememberMeUserNameCookie = Request.Cookies[RememberMeCookieName];
if (null != rememberMeUserNameCookie)
{
Response.Cookies.Remove(RememberMeCookieName);
rememberMeUserNameCookie.Expires = DateTime.Now.AddYears(-1);
rememberMeUserNameCookie.Value = null;
Response.SetCookie(rememberMeUserNameCookie);
}
}
【讨论】: