Может ли пользовательский UserNamePasswordValidator добавлять вещи в сеанс WCF?

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

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

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

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


person Roger Lipscombe    schedule 24.08.2010    source источник


Ответы (2)


Да, оно может. Вам понадобиться:

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

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

Для получения дополнительной информации см. это.

person Roger Lipscombe    schedule 22.09.2010

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

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

person Ladislav Mrnka    schedule 24.08.2010
comment
Чтобы проверить имя пользователя и пароль, мне нужно создать дорогостоящий COM-объект. Поскольку я буду использовать его позже, я хотел бы связать его с сеансом. - person Roger Lipscombe; 24.08.2010