Когда пользователь заходит на мой сайт, он получает страницу входа. После успешного входа в систему они могут выйти из системы, а другой пользователь может войти в систему. Однако, если пользователь нажимает кнопку «Назад» во время входа в систему, он переходит на страницу входа. На данный момент новый пользователь больше не может войти. Я получил ошибку токена против подделки.
Я пытался выйти из системы любого пользователя, который переходит на страницу входа. Я пробовал разные способы выхода из системы. Я даже пытался Session.Abandon();
Контроллер аккаунта:
// GET: /Account/Login
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
EnsureLoggedOut();
ViewBag.ReturnUrl = returnUrl;
// Store the originating URL so we can attach it to a form field
var viewModel = new LoginViewModel { ReturnUrl = returnUrl };
return View(viewModel);
}
// POST: /Account/Login
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (!ModelState.IsValid)
{
return View(model);
}
ApplicationUser user = new ApplicationUser();
try
{
user = DBcontext.Users.Where(u => u.Email.Equals(model.Email)).Single(); // where db is ApplicationDbContext instance
}
catch (InvalidOperationException)
{
// the user is not exist
return View("The user does not exist.");
}
var result = await SignInManager.PasswordSignInAsync(user.UserName, model.Password, model.RememberMe, shouldLockout: false);
SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
switch (result)
{
case SignInStatus.Success:
return RedirectToLocal(returnUrl);
case SignInStatus.LockedOut:
return View("Lockout");
case SignInStatus.RequiresVerification:
return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
case SignInStatus.Failure:
default:
ModelState.AddModelError("", "Invalid login attempt.");
return View(model);
}
}
// POST: /Account/LogOff
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LogOff()
{ Session.Abandon();
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
return RedirectToAction("Index", "Home");
}
private ActionResult RedirectToLocal(string returnUrl)
{
if (Url.IsLocalUrl(returnUrl))
{
return Redirect(returnUrl);
}
return RedirectToAction("Index", "Home");
}
}
Вход в систему:
@model LoginViewModel
@{ViewBag.PageId = "extr-page";
ViewBag.PageClass = "animated fadeInDown";}
@section topright{<span id="extr-page-header-space"> <span class="hidden-mobile">Need an account?</span> <a href="@Url.Action("register", "account")" class="btn btn-danger">Create account</a> </span>
}
<div id="content" class="container">
<div class="row">
@{ Html.RenderPartial("_LoginText"); }
<div class="col-xs-12 col-sm-12 col-md-5 col-lg-4">
<div class="well no-padding">
<form action="@Url.Action("Login", "Account")" method="POST" id="login-form" class="smart-form client-form">
<header>
Sign In
</header>
@Html.HiddenFor(m => m.ReturnUrl)
@Html.AntiForgeryToken()
@Html.ValidationBootstrap()
<fieldset>
<section>
<label class="label">E-mail</label>
<label class="input">
<i class="icon-append fa fa-user"></i>
<input type="Email" name="Email" value="demo@email.com">
<b class="tooltip tooltip-top-right"><i class="fa fa-user txt-color-teal"></i> Please enter email address/username</b>
</label>
</section>
<section>
<label class="label">Password</label>
<label class="input">
<i class="icon-append fa fa-lock"></i>
<input type="Password" name="Password" value="demo">
<b class="tooltip tooltip-top-right"><i class="fa fa-lock txt-color-teal"></i> Enter your password</b>
</label>
<div class="note">
<a href="@Url.Action("forgotpassword", "Account")"><i class="fa fa-frown-o"></i> Forgot password?</a>
</div>
</section>
<section>
<label class="checkbox">
<input type="checkbox" name="RememberMe" value="true" checked="checked">
<input type="hidden" name="RememberMe" value="false" />
<i></i>Stay signed in
</label>
</section>
</fieldset>
<footer>
<button type="submit" class="btn btn-primary">
Sign in
</button>
</footer>
</form>
</div>
@{ Html.RenderPartial("_SocialMedia"); }
</div>
</div>
Я надеялся, что когда пользователь нажмет кнопку «Назад» и он / она перейдет на страницу входа, предыдущий пользователь выйдет из системы.
Обновление 1:
Чтобы было ясно, я не беспокоюсь о пользователе, который только что вышел из системы и нажал кнопку "Назад". Наоборот, мой сайт ломается, когда пользователь успешно входит в систему, а затем нажимает кнопку «Назад». Он возвращает их обратно на страницу входа в систему, но имя пользователя или пароль не работают из-за вышеупомянутой ошибки защиты от подделки.
Обновление 2:
Я тестировал код в IE, и у него не было проблем. После дальнейших исследований похоже, что Chrome сохраняет cookie-файл аутентификации, когда я нажимаю кнопку «Назад». Тем не менее, когда я правильно выйду из системы, cookie-файл уничтожается. Я думал, что когда загружается страница входа в систему, я вызываю метод LogOff, но он не удаляет cookie. Я буду продолжать исследовать эту проблему. Может быть, у кого-то есть опыт с этим?
Обновление 3:
Я заметил, что печенье не было удалено, когда я ударил в спину. Когда я правильно выйду из системы, куки будут удалены. Когда я не кеширую страницу, используя метод Shoe, указанный ниже, cookie-файл действительно удаляется при ударе назад. Тем не менее, я все еще получаю ошибку токена анти-подделки. Что интересно, у меня есть часть заголовка, которая выскакивает на странице входа. Этот заголовок должен появляться только тогда, когда пользователь аутентифицирован. Там также должно быть боковое меню, чтобы всплывающее окно при аутентификации. Но это не так. Мне интересно, есть ли у меня проблема асинхронности, которая вызывает обе проблемы.