Mvc3 Анти-подделка токенов мульти вкладок - PullRequest
7 голосов
/ 27 марта 2012

у нас есть специфическая проблема с токеном защиты от подделки на странице входа. Если пользователь входит в систему только с одним активным окном, все работает отлично, однако, если пользователь открывает страницу входа в два разных окна и входит в систему из окна A (никаких проблем не будет входить в систему), а затем возвращается к входу из окна B в этом окне пользователь получит «Требуемый токен защиты от подделки не был предоставлен или был недействительным».

Есть ли способ обойти это, кроме как удалить токен защиты от подделки из действия view / controller? Мы бы предпочли иметь токен для дополнительной безопасности!

Это очень похоже на этот вопрос, однако он был задан для mvc2 MVC ValidateAntiForgeryToken проблема с несколькими вкладками

Ответы [ 2 ]

23 голосов
/ 03 сентября 2013

Это поведение в MVC3 или MVC4 является таким, как оно было разработано, однако оно очень недружественно для пользователя, как объяснено выше, однако в производственном процессе эту проблему нужно изящно решить, а приложению необходимо справиться с этой странной ситуацией. Решением этой проблемы является создание фильтра, который применяется к записи входа в систему, который будет проверять, вошел ли пользователь в систему, и перенаправит его на правильную страницу, в противном случае он останется на странице входа.

Ниже приведен код для атрибута фильтра

/// <summary>
/// Handle Antiforgery token exception and redirect to customer area if the user is Authenticated
/// </summary>
public class RedirectOnError : HandleErrorAttribute
{
    /// <summary>
    /// Override the on exception method and check if the user is authenticated and redirect the user 
    /// to the customer service index otherwise continue with the base implamentation
    /// </summary>
    /// <param name="filterContext">Current Exception Context of the request</param>
    public override void OnException(ExceptionContext filterContext)
    {
        if (filterContext.Exception is HttpAntiForgeryException && filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            // Set response code back to normal
            filterContext.HttpContext.Response.StatusCode = 200;

            // Handle the exception
            filterContext.ExceptionHandled = true;

            UrlHelper urlH = new UrlHelper(filterContext.HttpContext.Request.RequestContext);

            // Create a new request context
            RequestContext rc = new RequestContext(filterContext.HttpContext, filterContext.RouteData);

            // Create a new return url
            string url = RouteTable.Routes.GetVirtualPath(rc, new RouteValueDictionary(new { Controller = "CustomerArea", action = "Index" })).VirtualPath;

            // Check if there is a request url
            if (filterContext.HttpContext.Request.Params["ReturnUrl"] != null && urlH.IsLocalUrl(filterContext.HttpContext.Request.Params["ReturnUrl"]))
            {
                url = filterContext.HttpContext.Request.Params["ReturnUrl"];
            }

            // Redirect the user back to the customer service index page
            filterContext.HttpContext.Response.Redirect(url, true);
        }
        else
        {
            // Continue to the base
            base.OnException(filterContext);
        }
    }
}

Это пример использования

        [HttpPost]
        **[RedirectOnError]**
        [ValidateAntiForgeryToken]
        public ActionResult LogOn(LogOnViewModel model, UserSessionState session, string returnUrl)
        {
        .....
        }
4 голосов
/ 27 марта 2012

После входа в систему все предыдущие токены становятся недействительными. Вот как это должно работать. Наз подходит к правильному ответу, за исключением того, что токен в куки не хранит имя пользователя. Только токен в форме. Именно из-за этой проблемы: если пользователь входит в систему, все существующие токены form должны быть признаны недействительными, но аннулирование самого cookie-файла будет слишком проблематичным и недружественным для пользователя.

...