Можно ли с помощью пользовательского UserNamePasswordValidator уничтожить пользовательский WPF-сеанс? - PullRequest
1 голос
/ 24 августа 2010

Я использую пользовательский UserNamePasswordValidator, который создает экземпляр и входит в наш внутренний API.

Этот API предоставляет событие, которое вызывается, когда пользователь «выгнан» (другим пользователем с правами администратора), и я хотел бы ответить на это, завершив сеанс WCF, чтобы дальнейшие вызовы вызывали исключение.

Как мне это сделать?

Моя служба WCF размещена в службе Windows (не IIS). Создание и вход во внутренний API занимает довольно много времени, поэтому я не могу сделать это при каждом вызове службы.

Ответы [ 2 ]

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

Я нашел некоторый код в http://www.neovolve.com/post/2008/04/07/wcf-security-getting-the-password-of-the-user.aspx, который показывает, как использовать пользовательский класс ServiceCredentials и, оттуда, передавая данные пользователя до Thread.CurrentPrinciple.

из этого кода я спрятал объект Connection в пользовательском главном объекте, что означает, что я могу получить его в контексте сеанса.Затем я добавил пользовательский CodeAccessSecurityAttribute, который проверяет этот объект подключения, чтобы увидеть, не был ли он отключен.Если это так, генерируется исключение, которое убивает сеанс пользователя.

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

Если вы ожидаете, что служба будет аутентифицировать каждый пользовательский вызов с именем пользователя и паролем, вы можете иметь любой код в своем валидаторе. Но если вы ожидаете использования экземпляра службы сеанса, вы, вероятно, также будете использовать контекст безопасности (сеанс безопасности). В этом случае только первый запрос аутентифицируется валидатором, а последующий запрос аутентифицируется токеном, сгенерированным во время установления контекста безопасности.

Edit:

Каждый работающий сервис представлен классом InstanceContext. Если у вас есть службы PerSession, InstanceContext одинаков для каждого вызова. Если вы храните ссылку на InstanceContext где-то, вы должны иметь возможность освободить экземпляр и закрыть сеанс - я никогда не пробовал, но это должно быть возможно.

...