Токен для защиты от подделки на странице входа - PullRequest
19 голосов
/ 24 февраля 2012

Я внедрил токен защиты от подделки на своей странице входа в систему.

Теперь у меня был один пользователь, нажимающий клавишу "Назад" на клавиатуре, и когда они снова нажимают кнопку входа в систему после заполнения своих учетных данных, они получают страницу ошибки.

Есть ли какой-нибудь лучший способ справиться с этим делом, например, перенаправить их на новую страницу входа?

Страница, которая является страницей входа: / account / logon

Если данные для входа являются достаточными, пользователь перенаправляется на: домашнюю страницу / страницу указателя, на которой пользователь нажал кнопку назад.

Ответы [ 4 ]

20 голосов
/ 24 февраля 2012

Не применяйте ASP.NET AntiForgeryToken на своей странице входа. Токен основан на имени пользователя и других критериях, и на странице входа предполагается, что у злоумышленника уже есть учетные данные в системе, чтобы иметь возможность использовать csrf на этой странице.

Однако вы должны использовать какую-либо форму защиты от CSRF на своей странице входа в систему - см. https://security.stackexchange.com/a/2126/51772

7 голосов
/ 19 ноября 2014

Я написал полное решение здесь: 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>
}
5 голосов
/ 05 апреля 2012

Мое решение для этого было:

Перезагрузить страницу, если она снова попадет на страницу входа.это обеспечит новую загрузку токена защиты от подделки

и все будет сделано

0 голосов
/ 30 апреля 2019

Вместо проверки 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;
        }
}
...