2016-04-19 6 views
3

У меня есть несколько приложений ASP.net MVC, развернутых на одном сайте в IIS. Все приложения используют проверку подлинности на основе форм, и все приложения настроены на использование одного и того же машинного ключа.ASP.net MVC cross application POST request

Одно из приложений - это «базовый сайт», который обеспечивает навигацию к другим приложениям и выполняет обработку функций входа/выхода. В соответствии с этим пользователь может войти в систему на базовом сайте и посетить другие приложения, и они все равно будут проходить проверку подлинности, которая работает по назначению.

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

"The anti-forgery cookie token and form field token do not match." 

Это то, что мой журнал от действий выглядит в моем контроллере безопасности:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult LogOff() 
    { 
     FormsAuthentication.SignOut(); 

     return Redirect("~/"); 
    } 

Это это то, что моя форма выглядит как с точки зрения базового сайта:

using (Html.BeginForm("LogOff", "Security", FormMethod.Post, null)) 
       { 
        @Html.AntiForgeryToken() 
        <input type="submit" value="Log Off"/> 
       } 

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

using (Html.BeginForm("LogOff", "../Security", FormMethod.Post, null)) 
       { 
        @Html.AntiForgeryToken() 
        <input type="submit" value="Log Off"/> 
       } 

Базовый сайт находится в корневом каталоге, и другие приложения содержатся в отдельной папке в пределах этого корня.

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

+0

Поддерживает ли ваши веб-приложения одно решение или у вас есть другое решение для каждого приложения? –

+0

Первоначально они находятся в разных решениях, хотя они были опубликованы. – pjthomso

+0

Вы пытались выйти с разными таймингами?я имею в виду выход из того места, где вы хотите, чтобы тот момент, когда вы только что подписались, и дайте мне знать, что произойдет. –

ответ

0

AntiForgeryToken работает, создавая скрытое поле и Cookie с таким же жетоном (см. this blod post). Поскольку ваша форма отправляется на другой URL-адрес, я думаю, что cookie либо не передается вместе с POST, либо у вашего браузера все еще есть файл cookie с прежнего запроса на ваш базовый сайт и, следовательно, он передает неверный. Происходит ли такое поведение после удаления файлов cookie (чтобы убедиться, что старые не используются)?

+0

Очистка куки-файлов и попытка выхода из системы без загрузки новой страницы после получения ошибки «Необходимый анти-подделки cookie» __RequestVerificationToken «нет». Если я попытаюсь перейти на другую страницу после удаления файлов cookie, я отправляюсь на страницу входа в систему, поэтому, удалив файлы cookie, я по существу выхожу из системы. – pjthomso

0

Что я сделал для решения этой проблемы, переместите действие LogOff в пользовательский класс контроллера, который все мои контроллеры уже наследуют.

public abstract class BaseController : Controller 
    {   
     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult LogOff() 
     { 
      FormsAuthentication.SignOut(); 

      //Redirect to home page when logging off. 
      return Redirect("~/"); 
     } 
    } 

А потом просто изменил свою форму выхода из системы, чтобы вызвать действие LOGOFF от регулятора тока, а не specifiying контроллера безопасности в базе сайта:

using (Html.BeginForm("LogOff", "", FormMethod.Post, null)) 
       { 
        @Html.AntiForgeryToken() 
        <input type="submit" value="Log Off"/> 
       } 

Я не уверен, если есть способ заставить мою оригинальную версию работать, или нет, поэтому на данный момент я думаю, что я собираюсь пойти с этим.