Azure ACS + хранилище значений формы

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

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

Спасибо

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


person Keoz    schedule 26.11.2011    source источник
comment
Вы не должны использовать состояние приложения для хранения ориентированных на пользователя данных. Особенно в Azure (но не только в Azure). Цитата из: msdn.microsoft.com/en-us/library/ms178594.aspx: состояние приложения – удобное место для хранения небольших объемов часто используемых данных, которые не меняются от одного пользователя к другому.   -  person astaykov    schedule 27.11.2011
comment
Да, я действительно не хочу использовать состояние, спасибо :) хотя это не пользовательские данные, а просто данные, которые будут общедоступными.   -  person Keoz    schedule 27.11.2011


Ответы (2)


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

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

person Alexander Demuro    schedule 01.03.2012

Вы можете передать состояние в последовательности перенаправления 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 и выполняет перенаправление на него без дополнительной обработки. Это делает вещи простыми.

person Mike Goodwin    schedule 26.11.2011
comment
О, я вижу, так что этот параметр всегда будет возвращаться после входа в систему, и я могу прикрепить его к URL-адресу IP непосредственно перед тем, как он исчезнет, ​​верно? :) - person Keoz; 27.11.2011
comment
Правильно. Немного неудобно создавать собственную страницу выбора IP-адресов, но образец, который можно загрузить с консоли ACS, является хорошей отправной точкой. Удачи! - person Mike Goodwin; 27.11.2011
comment
Хорошо, я думаю, я понял, у параметра wctx есть параметры внутри, поэтому я думаю, что мне нужно изменить эту строку и добавить туда свой параметр, теперь еще один вопрос новичка: как я могу вернуть этот параметр в код из контроллера, когда пользователь возвращается? :( - person Keoz; 27.11.2011
comment
Я нашел этот пост полезным stackoverflow.com/questions/8240124/ Думаю, я близок к этому, я покопаюсь в этом :) спасибо - person Keoz; 27.11.2011
comment
Да, я сделал это, спасибо :) это был просто вопрос передачи контекста помощникам, которые у меня уже были, которые пришли с образцом простого ACS для ASP.net mvc учебного комплекта, и вернуть параметр так, как вы описываете - person Keoz; 29.11.2011