Смешанная аутентификация WCF WebHttp (базовая и анонимная)

StackOverflow https://stackoverflow.com/questions/209795

Вопрос

Все это относится к привязке 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 чрезвычайно настраиваем, и вы, вероятно, можете сделать это, написав собственный канал/привязку, которая будет делать то, что вы хотите.Рекомендую вам взглянуть на ОТДЫХ Шахматы исходный код.Это должно помочь вам начать.

Лучше всего реализовать роли по умолчанию через поставщика ролей и позволить анонимным пользователям автоматически присоединяться к этой роли.Затем либо программно, либо с помощью политики внедрения политики (аспектно-ориентированной), настраиваемой так, чтобы определенный анонимный доступ был разрешен через определенную роль.

Что касается настройки через конфигурацию, то, если это возможно, это будет довольно сложно и своего рода «хакерски».

Я так не думаю...Я как раз писал, что вам нужно создать отдельную конечную точку, когда решил еще раз прочитать ваш вопрос и заметил последнее утверждение вашего вопроса.Так что ответ будет нет (насколько я знаю)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top