Mvc3 многоточие

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

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

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

2 ответа

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


Такое поведение в 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>
 /// Current Exception Context of the request
 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)
 {
 .....
 }

licensed under cc by-sa 3.0 with attribution.