Обработка WIF SignInResponseMessage (Post), когда пользователь запрашивает метод действия с перегрузками [HttpGet] и [HttpPost]]

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

У меня есть два метода контроллера, которые говорят «Редактировать», которые защищены фильтром действий, который вызывает пассивную аутентификацию для STS.

[HttpGet]
public ActionResult Edit(Guid id) { [do stuff] }

[HttpPost]
public ActionResult Edit(Guid id, EditViewModel model) { [do stuff] }

Проблема в том, что mvc получает SignInResponseMessage, а затем запускает HttpPost, а это не то, что мне нужно... Кто-нибудь подходил к этой проблеме и считает, что у них есть хорошее решение?

Думаю, я мог бы однозначно назвать все свои методы действий, если случится худшее, то есть старый добрый mvc1 Edit() vs Update() / New() vs Create() и т. д.


person Jonathon Kresner    schedule 25.09.2011    source источник
comment
Вы пытались вызвать контроллер с помощью ActionLink, чтобы узнать, был ли он вызван через GET? Вы видите POST в этом случае?   -  person Massimo Zerbini    schedule 26.09.2011
comment
Вариант использования — просто вставить URL-адрес в браузер и нажать Enter (что вызывает получение, которое перенаправляет на STS). Насколько я понимаю, сеанс токена/WIF создается через сообщение...   -  person Jonathon Kresner    schedule 27.09.2011
comment
Я нашел эту статью, может быть, это может помочь. msdn.microsoft.com/en-us/magazine/dd347547.aspx На рисунке 2 видно, что браузер отправляет POST после вызова STS, но я не знаю, ваш ли это сценарий.   -  person Massimo Zerbini    schedule 27.09.2011


Ответы (1)


У меня есть решение...

Вместо того, чтобы разрешить STS отправлять сообщения на любой URL-адрес (и выполнять любое действие в приложении), я использую настройку в своей STS для публикации на одном URL-адресе, который имеет метод действия, который выглядит следующим образом:

public ActionResult Index() {

    if (MyIdentity.IsAuthenticated) {
        if (ControllerContext.HttpContext.Request["wreply"] != null)
        {
            var returnUrl = ControllerContext.HttpContext.Request["wreply"];
            if (returnUrl.StartsWith(Stgs.WebRt)) { return Redirect(returnUrl); } //make sure the wreply is actually for this application and not a random url
        }

        return Redirect("/"); 
    }

    return View(); 
}

Затем в STS, когда я создаю SignOutResponseMessage, я добавляю строку:

response.SetParameter("wreply", message.Reply);

где «ответ» — это Microsoft.IdentityModel.Protocols.WSFederation.SignInReponseMessage, а «сообщение» — это Microsoft.IdentityModel.Protocols.WSFederation.SignInRequestMessage. Это в основном добавляет wreply в качестве ввода формы, который отправляется проверяющей стороне. Следовательно, приведенный выше код действия контроллера работает должным образом.

person Jonathon Kresner    schedule 07.10.2011