Безопасность WCF: имя пользователя, пароль и еще один параметр
В нашем проекте все службы WCF защищены опцией wsHttpBinding (TransportWithMessageCredential, UserName).
Он работает нормально, но теперь нам нужно реализовать защиту с еще одним параметром (ClientId).
Когда служба WCF получает вызов, она не знает, что такое DB вызова (где проверить имя пользователя и пароль), поэтому сначала она должна перейти в "основную" базу данных нашей компании (где хранятся все клиенты).) и получить строку подключения по ClientId.
Как мы можем реализовать это?
2 ответа
Я реализовывал это в прошлом, используя специально отформатированные строки имени пользователя, чтобы можно было отправлять дополнительную информацию. Не существует никаких правил относительно того, как именно вы отправляете имя пользователя и пароль в этих строковых полях, поэтому на самом деле содержимое может быть сериализованным объектом, сжатой строкой или чем-то еще, что вы считаете необходимым.
Я не мог найти другой способ элегантно отправить информацию.
Просто разберите эту информацию в вашей реализации AuthorizationPolicy.
Я решил аналогичные проблемы с MessageInspectors. По сути, вы создаете IClientMessageInspector
который добавляет идентификатор клиента к заголовкам сообщения и IDispatchMessageInspector
который читает идентификатор клиента из этого заголовка и сохраняет его в соответствующем месте (как в пользовательской реализации IPrincipal
установить как Thread.CurrentPrincipal
).