Антивирусный токен на странице входа

Я внедрил токен 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;
        }
}