Я внедрил токен antiforgery на моей странице входа.
Теперь у меня был один пользователь, который нажимал клавишу на клавиатуре,
и когда они снова нажимают кнопку входа в систему после заполнения своих учетных данных, они получают страницу с ошибкой.
Есть ли лучший способ передать этот случай, например, перенаправить их на новая страница входа?
Страница, которая является страницей входа: /account/logon
Если данные входа в систему достаточно успешны, пользователь перенаправляется на: Главная страница/Индекс
на котором пользователь нажал кнопку назад.
Ответ 1
Моим решением было следующее:
Перезагрузите страницу, если она снова попадает на страницу входа в систему.
это обеспечит свежую загрузку токена антифригации
и все сделано
Ответ 2
Не используйте ASP.NET AntiForgeryToken на своей странице входа. Маркер основан на имени пользователя среди других критериев, и страница входа в систему предполагает, что злоумышленник уже имеет учетные данные для системы, чтобы иметь возможность использовать csrf на этой странице.
Однако на странице входа в систему вы должны использовать некоторую форму защиты CSRF - см. https://security.stackexchange.com/a/2126/51772
Ответ 3
Я написал полное решение здесь: https://richardcooke.info/en/2014/keep-users-signed-in-after-asp-net-deploy/
Вот необходимый код для вызова в вашем контроллере формы вашего метода GET:
private void SetANewRequestVerificationTokenManuallyInCookieAndOnTheForm()
{
if (Response == null)
return;
string cookieToken, formToken;
AntiForgery.GetTokens(null, out cookieToken, out formToken);
SetCookie("__RequestVerificationToken", cookieToken);
ViewBag.FormToken = formToken;
}
private void SetCookie(string name, string value)
{
if (Response.Cookies.AllKeys.Contains(name))
Response.Cookies[name].Value = value;
else
Response.Cookies.Add(new HttpCookie(name, value));
}
и код для представления вместо Html.AntiForgeryToken():
@if (ViewBag.FormToken != null)
{
<text><input name="__RequestVerificationToken" type="hidden" value="@ViewBag.FormToken" /></text>
}
else
{
<text>@Html.AntiForgeryToken()</text>
}
Ответ 4
Вместо того, чтобы проверять User.Identity.IsAuthenticated, как некоторые другие упомянутые посты, я использовал собственный атрибут для обработки исключений и перенаправления пользователя на домашнюю страницу, если это HttpAntiForgeryToken
Я считаю, что это позволяет избежать любых потенциальных проблем безопасности при использовании других методов, и что [ValidateAntiForgeryToken] всегда следует использовать в методах POST
public override void OnException(ExceptionContext filterContext)
{
var controllerName = (string)filterContext.RouteData.Values["controller"];
var actionName = (string)filterContext.RouteData.Values["action"];
var model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
if (filterContext.Exception is HttpAntiForgeryException)
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary
{
{ "action", "Index" },
{ "controller", "Home" }
});
filterContext.ExceptionHandled = true;
}
}