"Запомнить меня" с ASP.NET MVC Authentication не работает
У меня есть стандартный веб-проект ASP.NET MVC (RC Refresh) со стандартным провайдером членства ASP.NET и контроллером учетной записи, который включен в шаблон проекта.
Когда я проверяю "Запомнить меня" в моей форме входа, я до сих пор не помню сайт. (Firefox запоминает мое имя пользователя и пароль, но я должен был автоматически войти в систему).
Нужно ли устанавливать и проверять файл cookie вручную? Если да, то как это лучше всего сделать?
Ответы
Ответ 1
Вам нужно передать true/false методу SetAuthCookie.
public ActionResult Login (string email, string password, bool rememberMe, string returnUrl)
{
// snip
FormsAuth.SetAuthCookie(username, rememberMe); // <- true/false
// snip
}
и убедитесь, что bool rememberMe
отражает статус флажка на странице входа.
Ответ 2
Вам нужно создать постоянный файл cookie в методе контроллера, который обрабатывает вход в систему, когда флажок Запомнить меня. Если вы используете RedirectFromLoginPage
, установите для аргумента createPersistentCookie значение true
.
Ответ 3
Эти 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);
}
}