Может ли пользовательский UserNamePasswordValidator добавить вещи в сеанс WCF? - PullRequest
2 голосов
/ 24 августа 2010

В связи с этим вопросом , я создаю экземпляр подключения к нашему внутреннему API внутри моего пользовательского UserNamePasswordValidator.Могу ли я спрятать это где-нибудь, чтобы я мог использовать его в будущих вызовах в сеансе этого пользователя?

Это похоже на этот вопрос , но я не использую IIS, поэтому я могу 't использовать HttpContext.Current (или я могу?).

Обновление: Некоторый контекст: наш внутренний API предоставляется через COM-объект, который предоставляет метод Login.Вместо того, чтобы в моем сервисном интерфейсе был метод Login, у меня есть пользовательский UserNamePasswordValidator, который вызывает метод Login для COM-объекта.

Поскольку создание экземпляра COM-объекта и вход в него дорогой,Я хотел бы повторно использовать теперь зарегистрированный COM-объект в моих методах обслуживания.

Ответы [ 2 ]

5 голосов
/ 22 сентября 2010

Да, это возможно. Вам понадобится:

  • пользовательская ServiceCredentials реализация, которая возвращает пользовательскую SecurityTokenManager.
  • пользовательская SecurityTokenManager реализация, которая возвращает пользовательскую CustomUserNameSecurityTokenAuthenticator.
  • ваш пользовательский CustomUserNameSecurityTokenAuthenticator должен переопределить ValidateUserNamePasswordCore и должен добавить пользовательскую реализацию IAuthorizationPolicy.
  • ваша реализация IAuthorizationPolicy должна реализовывать Evaluate, после чего она может начать помещать вещи в контекст WCF.
  • замените значение evaluationContext["PrimaryIdentity"] на PasswordIdentity или пользовательское IIdentity.
  • замените значение evaluationContext["Principal"] на PasswordPrincipal или пользовательское IPrincipal.
  • обновить коллекцию evaluationContext["Identities"], чтобы заменить экземпляр GenericIdentity на ваш пользовательский экземпляр.

Таким образом, вы можете создать собственную реализацию IPrincipal с дополнительной информацией.

Подробнее см. this .

0 голосов
/ 24 августа 2010

UserNamePasswordValidator абсолютно не соответствует всем контекстам WCF.Он используется только для проверки имени пользователя и пароля.Можете ли вы еще объяснить свою проблему?

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

...