WCF, Пользовательское членство и HttpContext - PullRequest
0 голосов
/ 28 ноября 2009

Хорошо, я действительно собираюсь показать мою глупость относительно модели безопасности ASP.NET здесь, но здесь идет.

У меня есть веб-сервис WCF, и мне удалось взломать мой путь через моего провайдера пользовательского членства.

Мой поставщик членства переопределяет «ValidateUser», в котором я пытаюсь загрузить объект пользователя с данными из нашего экземпляра сервера SQL. Пока все хорошо, я получаю кредиты, загружаю объект users и возвращаю true, если не столкнулся с какими-либо неровностями на дороге.

На этом этапе я обычно вставляю пользовательский объект (или идентификатор) в сеанс или просто в какой-то пакет состояний, доступный в течение всего срока действия запроса. Проблема, с которой я сталкиваюсь, заключается в том, что HttpContext на этом этапе является нулевым, хотя я использую атрибуты совместимости ASP.

Какие еще варианты у меня под рукой? Ура, Крис.

EDIT:

Просто чтобы уточнить, что я хочу сделать. Я хочу передать учетные данные пользователя для аутентификации на сервере, и как только это произойдет, я хотел бы сохранить данные аутентифицированного пользователя где-нибудь , к которым я могу получить доступ в течение срока службы сервиса. только запрос Это будет эквивалент Http.Current.Items?

Существует ли какой-либо объект, который создается для каждого запроса, к которому я могу получить глобальный доступ через статическое свойство (то есть аналогично HttpContext.Current)? Я предполагал, что OperationContext был этим, но это также нуль?

Неужели это действительно такая необычная проблема? Отправляйте кредиты> извлекайте пользователя> заполняйте пользователя где-нибудь для доступа на протяжении обработки запроса. Мне кажется, что я скучаю?

Ура, Крис.

1 Ответ

0 голосов
/ 29 ноября 2009

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

Это может показаться неэффективным, но веб-приложения и, в частности, веб-службы, должны быть по возможности полностью без сохранения состояния. Помещение вещи в «пакет состояния» просто вызывает проблемы в будущем - как вы узнаете, когда аннулировать эту кэшированную копию учетных данных? Что, если у пользователя есть ваше приложение, но cookie остается на его компьютере?

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

Если вы все еще настаиваете на этом клудже, вы можете включить режим ASP.NET «compabitility» для WCF, который должен дать вам доступ к HttpContext - но опять-таки: я настоятельно рекомендую против этого. Первое и наиболее очевидное ограничение заключается в том, что этот режим совместимости с ASP.NET, конечно, работает только при размещении службы WCF в IIS, чего я бы предпочел не делать в рабочем коде.

Чтобы включить режим совместимости ASP.NET, используйте этот параметр в web.config:

<system.serviceModel>
   <serviceHostingEnvironment 
        aspNetCompatibilityEnabled="true"/>
</system.serviceModel>

и вам нужно украсить реализацию сервиса (класс, реализующий сервисный контракт) соответствующим атрибутом:

[AspNetCompatibilityRequirements(RequirementsMode=
       AspNetCompatibilityRequirementsMode.Allowed)]
class YourService : IYourService

AspNetCompatibilityRequirementsMode может быть NotAllowed, Allowed или Required.

Для получения дополнительной информации и более подробного объяснения см. Сообщение в блоге Вэньлонга Донга о Режим совместимости ASP.NET

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...