Смешанная аутентификация WCF WebHttp (базовая и анонимная)
-
03-07-2019 - |
Вопрос
Все это относится к привязке WebHttp, размещенной на специальном узле службы (IIS в настоящее время не поддерживается).
Я реализовал собственный UserNamePasswordValidator и собственный IAuthorizationPolicy.Когда я настраиваю привязку конечной точки на использование базовой проверки подлинности, все работает так, как мне хотелось бы (пользовательский субъект, пользовательские роли и т. д.).
Я также хотел бы добавить возможность анонимного доступа по HTTP, и мои собственные реализации поместили бы анонимного пользователя в некоторые роли по умолчанию и т. д.(если заголовок Authenticate не отправлен).
Что происходит сейчас, так это то, что анонимным пользователям выдается код 401 до того, как будет использован какой-либо мой собственный код.Если я отключу требование базовой аутентификации HTTP, заголовок Authenticate вообще игнорируется.
Как мне настроить, или введите заголовок Authenticate, чтобы сделать это в обоих направлениях (без создания двух отдельных конечных точек)?
Решение
Прежде всего, сервис корректно реагирует на анонимный звонок, согласно Спецификация.
Во-вторых, это невозможно.Если вы размещаете свою службу самостоятельно и у вас есть привязка HTTP, WCF будет использовать System.Net.HttpListener
экземпляр, чтобы иметь возможность отвечать на HTTP-запросы (созданные в System.ServiceModel.Channels.SharedHttpTransportManager.OnOpen
).У этого слушателя есть метод под названием HandleAuthentication
это вызывается задолго до вызова любого вашего пользовательского кода.Он отвечает за отправку ответа 401 с запросом (WWW-Authenticate).Вы ничего не можете с этим поделать.Если есть, я хотел бы знать.
Итак, у вас остались следующие варианты:
- две конечные точки
- настройте своих клиентов, чтобы они знали учетные данные по умолчанию
- измените своих клиентов, чтобы они могли ответить на вызов
Другие советы
Я исследовал этот вопрос раньше и обнаружил, что это невозможно с помощью конфигурации, если вы не создадите две отдельные конечные точки (а это не то, что вам нужно).WCF просто не поддерживает его «из коробки».
Однако WCF чрезвычайно настраиваем, и вы, вероятно, можете сделать это, написав собственный канал/привязку, которая будет делать то, что вы хотите.Рекомендую вам взглянуть на ОТДЫХ Шахматы исходный код.Это должно помочь вам начать.
Лучше всего реализовать роли по умолчанию через поставщика ролей и позволить анонимным пользователям автоматически присоединяться к этой роли.Затем либо программно, либо с помощью политики внедрения политики (аспектно-ориентированной), настраиваемой так, чтобы определенный анонимный доступ был разрешен через определенную роль.
Что касается настройки через конфигурацию, то, если это возможно, это будет довольно сложно и своего рода «хакерски».
Я так не думаю...Я как раз писал, что вам нужно создать отдельную конечную точку, когда решил еще раз прочитать ваш вопрос и заметил последнее утверждение вашего вопроса.Так что ответ будет нет (насколько я знаю)