Хранилище значений формы Azure ACS + - PullRequest
1 голос
/ 26 ноября 2011

Я использую Azure ACS на своем веб-сайте ASP.net MVC 3 (также размещенном на Azure), сценарий таков: сначала пользователь заходит на мой веб-сайт и заполняет форму в одно поле, затем ему нужно выбрать поставщика ивойдите, но сначала я хочу сохранить значение поля, поэтому, когда они возвращаются после входа в систему, я могу создать профиль с этим значением для вошедшего в систему пользователя.

Поэтому я верю, когда они впервые заходят на сайта затем уходит, чтобы войти и заходит снова на сайт, это две разные сессии, я прав?и именно поэтому хранимые данные, использующие состояние сеанса (через SQL Server), отсутствуют, когда они возвращаются после входа в систему, я прав?если это правда, что будет лучшим подходом тогда?если нет, то я делаю что-то неправильно, сохраняя временные данные, верно?

Спасибо

ОБНОВЛЕНИЕ: Я обнаружил, что состояние HttpContext.Application работает, сохраняя данные, но яне уверен, что это хорошая идея - использовать его в контроллере, учитывая, что он в Azure, будет ли он работать на производстве должным образом?

Ответы [ 2 ]

3 голосов
/ 27 ноября 2011

Состояние можно передать в последовательности перенаправления WS-Federation с помощью параметра URL-адреса wctx.В действии, которое обрабатывает начальный запрос POST, вы должны получить параметр формы, который хотите сохранить, и перенаправить на страницу выбора вашего поставщика удостоверений (это должна быть пользовательская страница) с параметром формы, добавленным к URL-адресу.Когда пользователь выбирает IP на вашей странице, вы можете снова передать параметр, используя параметр wctx.В профиле пассивного запрашивающего WS-Federation говорится, что это должно быть возвращено вам в конечном итоге, когда IP перенаправляет пользователя обратно на ваш сайт.

Здесь есть некоторые детали

http://msdn.microsoft.com/en-us/library/bb608217.aspx

Редактировать: Чтобы получить параметр wctx из запроса, когда пользователь наконец вернется к вашему приложению.Поместите что-то вроде этого в код действия:

var fam = FederatedAuthentication.WSFederationAuthenticationModule;

if (fam.CanReadSignInResponse(System.Web.HttpContext.Current.Request, true))
{
    string wctxValue = this.HttpContext.Request.Form["wctx"];
}

Я предпочитаю, чтобы параметр wcxt представлял URL перенаправления (закодированный URL) с вашим параметром в качестве параметра запроса, так что это будет версия с закодированным URLиз этого:

wctx=https://yourserver/yourapp/yourpage?yourparameter=foo

Тогда действие, которое получало перенаправление от ACS, просто извлекло бы значение wctx и сделало бы перенаправление на него без какой-либо дополнительной обработки.Это делает вещи простыми.

0 голосов
/ 02 марта 2012

Другой подход заключается в том, чтобы сохранить любые данные, которые вам нужно передать в базу данных, и просто передать некоторый идентификатор, который ссылается на запись базы данных. Вы передадите этот идентификатор на IP и обратно через wctx (как упоминал Майк выше).

Это решит проблему ограниченной длины URL-адресов (если ваши данные очень велики). Конечно, вам нужно будет управлять удалением этих данных, но это не должно быть сложно.

...