Я просматриваю журналы ошибок проекта разработки и обнаружил следующую ошибку (имя изменено для защиты виновного невинно) -
Предоставленный токен анти-подделки предназначен для пользователя ", но текущий пользователь" admin".
Это не было особенно сложной проблемой для воспроизведения -
- Откройте приложение на странице входа
- Откройте второе окно или вкладку того же браузера на том же компьютере на странице входа в систему перед входом в систему
- Войдите в первое окно (или, действительно, второе, порядок не имеет значения)
- Попытка входа в оставшееся окно входа в систему
Трассировка стека -
System.Web.Mvc.HttpAntiForgeryException(0x80004005): предоставленный токен анти-подделки предназначался для пользователя ", но текущий пользователь" Админы". в System.Web.Helpers.AntiXsrf.TokenValidator.ValidateTokens(HttpContextBase httpContext, идентификатор IIdentity, AntiForgeryToken sessionToken, Поле AntiForgeryTokenToken) при System.Web.Helpers.AntiXsrf.AntiForgeryWorker.Validate(HttpContextBase httpContext) в System.Web.Helpers.AntiForgery.Validate() at System.Web.Mvc.ValidateAntiForgeryTokenAttribute.OnAuthorization(AuthorizationContext filterContext) в System.Web.Mvc.ControllerActionInvoker.InvokeAuthorizationFilters(ControllerContext controlContext, IList`1, ActionDescriptor actionDescriptor) в System.Web.Mvc.Async.AsyncControllerActionInvoker <. > C__DisplayClass25.b__1e (AsyncCallback asyncCallback, Object asyncState)
Подпись метода входа -
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl)
{
...
}
Это точно так же, как подпись для метода в веб-проекте "ASP.NET MVC 4 Web Application", который указывает, что Microsoft либо почувствовала, что ValidateAntiForgeryToken была необходима/передовая практика, либо просто добавила атрибут здесь, потому что он использовался повсюду.
Очевидно, я ничего не могу сделать, чтобы справиться с проблемой в этом методе, поскольку она не достигнута, ValidateAntiForgeryToken является фильтром предварительного запроса и блокирует запрос до того, как он дойдет до контроллера.
Я мог проверить, аутентифицирован ли пользователь через Ajax перед отправкой формы и попытаться перенаправить их, если это так, или просто удалить атрибут.
Вопрос в том, что я понимаю, что маркер - это дизайн для предотвращения запросов с другого сайта (CSRF), когда пользователь уже прошел аутентификацию против вашего сайта, поэтому на этой основе это проблема удаления его из формы которые по определению будут использоваться неавторизованными пользователями?
Предположительно, атрибут в этом случае предназначен для смягчения злонамеренных участников, предоставляющих поддельные формы входа для вашего приложения (хотя к тому времени, когда исключение выбрасывается, предположительно, пользователь уже ввел свои данные, которые будут записаны, но может предупредить их, что-то не так). В противном случае представление неправильных учетных данных в форму с внешнего сайта приведет к точно таким же результатам, что и на самом сайте? Я не полагаюсь на проверку/санитарию клиента для очистки потенциально опасного ввода.
Если другие разработчики сталкиваются с этой проблемой (или у нас необычно творческие пользователи), и если да, то как вы ее разрешили/смягчили?
Обновление: Эта проблема все еще существует в MVC5, полностью преднамеренно, теперь с сообщением об ошибке "Предоставленный токен анти-подделки предназначен для другого пользователя, основанного на требованиях, чем у текущего пользователя". при использовании шаблонов по умолчанию и поставщиков удостоверений. Существует важный вопрос и интересный ответ от разработчика Microsoft Developer Evangelist и Troy, написанного автором PluralSight Адама Тульпера, в токене антивируса на странице входа в систему, который рекомендует просто удалить токен.