Вопрос по c#, asp.net-mvc – Как я могу исправить токен против подделки, предназначенный для пользователя «», но текущий пользователь - «xxxx» ошибка

9

Предоставленный токен защиты от подделки был предназначен для пользователя "", но текущим пользователем является "xxxx".

Я следовал каждому возможному решению, чтобы избавиться от этой ошибки без какого-либо успеха:

Вот сценарий: у меня есть две отдельные вкладки входа в систему, открытые на вкладке A браузера B: 1. Я захожу на свой сайт с помощью вкладки A 2. Затем попробуйте войти на вкладку B

Вышеупомянутая ошибка тогда происходит

Мой вид входа в C # web MVC имеет:

v class="col-md-4 col-md-offset-4">
                <form class="form-signin" role="form" [email protected]("Login", "Account") method="POST" id="signInForm">
                     @Html.AntiForgeryToken()
                    <div class="form-group">
                        <label for="loginEmail">Email</label>
                        <input  type="text" id="loginEmail" name="loginEmail" class="form-control" placeholder="Email address" >
                    </div>
                    <div class="form-group">
                        <label for="loginPassword">Password</label>
                        <input id="loginPassword" type="password"  name="loginPassword" class="form-control" placeholder="Password" >
                    </div>
                    <button class="btn btn-lg btn-primary btn-block main-btn" type="submit">Sign in</button>
                    <div>
                        <br>
                        <a href="@Url.Action("Index","GettingStarted")">Register</a><br>
                        <a href="@Url.Action("ForgotPassword","Account")">Forgot your password?</a>
                    </div>
                </form>

И мой контроллер учетных записей, как это:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model)
{

    if (ModelState.IsValid)
    {

Как я могу исправить эту ошибку?

В любом случае, когда это когда-нибудь станет проблемой в реальном мире (то есть, как в итоге попытаться войти дважды с двух вкладок на один и тот же сайт)? После того, как вы вошли на вкладку A, вы вошли на вкладку B, просто обновите страницу ... Tommy
Это не - по крайней мере, не в моем окне (также обновляется) Nyra
Почему это закрыто user1526912

Ваш Ответ

1   ответ
12

Это происходит потому, что две вкладки браузера используют один и тот же магазин cookie. Аутентификация с первой вкладкой устанавливает новый файл cookie, который идентифицирует ваше имя пользователя. Когда вторая вкладка будет отправлена, она передаст обновленный файл cookie, полученный после успешной аутентификации на первой вкладке, вместе со скрытым полем формы, которое было загружено до аутентификации и которое идентифицирует вас как анонимного пользователя. Поскольку имена пользователей в файле cookie и в скрытом поле формы не совпадают, проверка не проходит.

AntiForgeryWorker, который использует ValidateAntiForgeryTokenAttribute, кодирует аутентифицированное имя пользователя как в файл cookie, так и в скрытое поле формы и гарантирует, что они оба совпадают при проверке. Таким образом, всякий раз, когда вы аутентифицируете или меняете пользователей, эта проверка завершится неудачей, если вы отправляете сообщение в действие с помощью ValidateAntiForgeryTokenAttribute.

К сожалению, это означает, что ваши параметры ограничены тем, что вы не можете защитить действие входа в систему с помощью ValidateAntiForgeryTokenAttribute, игнорируете описанный вами сценарий и допускаете сбой проверки, или повторно реализуете реализацию AntiForgery в MVC, которая не включает имя пользователя в процедуру проверки.

Это первый достойный ответ, который я нашел на SO по этому вопросу. хорошо сделано! Timothy Groote
stackoverflow.com/questions/14970102/... перечисляет некоторые варианты, которые у вас есть. Lukas

Похожие вопросы