WCF WebHttp смешанная аутентификация (базовая и анонимная) - PullRequest
8 голосов
/ 16 октября 2008

Все это относится к привязке WebHttp, размещенной на пользовательском узле службы (IIS в настоящее время недоступен).

Я реализовал пользовательский UserNamePasswordValidator и пользовательскую IAuthorizationPolicy. Когда я настраиваю привязку конечной точки для использования обычной проверки подлинности, все работает так, как мне бы хотелось (пользовательский участник, пользовательские роли и т. Д.).

Я бы хотел добавить возможность анонимного HTTP-доступа, и чтобы мои пользовательские реализации помещали Анонимного пользователя в некоторые роли по умолчанию и т. Д. (Если заголовок Authenticate не отправляется).

Что происходит сейчас, так это то, что анонимным пользователям дают 401 до того, как удастся выполнить любой из моих пользовательских кодов. Если я отключу требование проверки подлинности HTTP Basic, тогда заголовок Authenticate будет полностью игнорироваться.

Как мне настроить или добавить заголовок Authenticate , чтобы сделать это обоими способами (без создания 2 отдельных конечных точек)?

Ответы [ 4 ]

1 голос
/ 24 октября 2008

Прежде всего, сервис правильно отвечает на анонимный звонок, согласно спецификации .

Во-вторых, это невозможно. Когда вы самостоятельно размещаете свой сервис и у вас есть некоторая привязка http, WCF будет использовать экземпляр <a href="http://msdn.microsoft.com/en-us/library/system.net.httplistener.aspx" rel="nofollow noreferrer">System.Net.HttpListener</a>, чтобы иметь возможность отвечать на запросы http (созданные в System.ServiceModel.Channels.SharedHttpTransportManager.OnOpen). Этот слушатель имеет метод с именем HandleAuthentication, который вызывается задолго до вызова любого вашего пользовательского кода. Он отвечает за отправку ответа 401 с запросом (WWW-Authenticate). С этим ничего не поделаешь. Если есть, я хотел бы знать.

Итак, у вас остались следующие опции:

  • две конечные точки
  • настроить ваших клиентов, чтобы они знали учетные данные по умолчанию
  • измените своих клиентов, чтобы они могли ответить на вызов
0 голосов
/ 18 октября 2008

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

Тем не менее, WCF чрезвычайно настраиваемый, и вы можете сделать это, написав собственный канал / привязку, которая будет делать то, что вы хотите. Я рекомендую вам взглянуть на REST Chess исходный код . Это должно помочь вам начать.

0 голосов
/ 20 октября 2008

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

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

0 голосов
/ 17 октября 2008

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

...