2017-02-06 14 views
0

Я написал очень простой WFCSerice, который возвращает имя пользователя Windows. Вот на стороне клиента код:У базовой аутентификации нет заголовка безопасности

public Form1() 
     { 
      ServiceReference1.Service1Client s1 = new ServiceReference1.Service1Client(); 
      s1.ClientCredentials.Windows.ClientCredential = System.Net.CredentialCache.DefaultNetworkCredentials; 
      string str = s1.ReturnWindowsUsername(); 
      InitializeComponent(); 
     } 

Я могу видеть учетные данные в HTTP-заголовке, используя Fidddler:

enter image description here

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

public Form1() 
     { 
      InitializeComponent(); 
      ServiceReference1.Service1Client s1 = new ServiceReference1.Service1Client(); 
      s1.ClientCredentials.UserName.UserName = "testuser"; 
      s1.ClientCredentials.UserName.Password = "testpassword"; 
      string str = s1.GetData(1); 

     } 

Вот скриншот из Fiddler при использовании обычной проверки подлинности:

enter image description here

Почему нет ничего в заголовке при использовании обычной проверки подлинности. Служба базовой проверки подлинности работает, как ожидалось. Вот ответ (интересно там, как представляется, два запроса и два ответа):

enter image description here

+0

У вас есть анонимная аутентификация отключена и базовая аутентификация enabl в IIS? Заголовок авторизации добавляется только к запросу * после * запроса 401 с сервера. Если запрос разрешен анонимно, нет 401 и, следовательно, нет необходимости в заголовке. – user1429080

+0

@ user1429080, оба включены. – w0051977

+0

Попробуйте отключить анонимную аутентификацию. Есть ли разница? – user1429080

ответ

1

Базовая аутентификация работает на HTTP уровне. Общий поток заключается в том, что клиент запрашивает ресурс, а затем сервер выдает вызов, а затем клиент выдает новый запрос с включенным заголовком Authorization. Если имя пользователя и пароль в заголовке Authorization принимаются сервером, клиент обычно добавляет заголовок для последующего запроса, не пройдя снова шаги request - challenge - re-request-with-authorization.

Если у вас все правильно настроено, вы должны ожидать увидеть два запроса в Fiddler.

  1. Один запрос без заголовка Authorization. Ответ от сервера для этого запроса будет 401 с прикрепленным заголовком WWW-Authenticate: Basic realm="your realm".
  2. Затем вы должны увидеть второй запрос, в котором заголовок Authorization был отправлен клиентом.

Вот пример из моего окружения:

enter image description here

Если вы не видите 401 вызова с сервера, то базовая аутентификация не правильно настроена.

Для того чтобы прокси-сервер предоставил заголовок, вам необходимо настроить привязку вашего клиента для использования <transport clientCredentialType="Basic"/>. Или это то, что я сделал, кто знает с WCF с множеством вариантов конфигурации.

EDIT: Я использовал это на стороне службы:

<bindings> 
    <basicHttpBinding> 
    <binding name="httpTransportCredentialOnlyBinding"> 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Basic" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 

О клиенте:

<bindings> 
    <basicHttpBinding> 
    <binding name="BasicHttpBinding_IService1"> 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Basic"/> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<client> 
    <endpoint address="http://localhost:53156/Service1.svc" binding="basicHttpBinding" 
    bindingConfiguration="BasicHttpBinding_IService1" contract="WcfTest_CBT.IService1" 
    name="BasicHttpBinding_IService1" /> 
</client> 

Я использую basicHttpBinding, TransportCredentialOnly и Basic для того, чтобы проверить это легко и без SSL хлопот и т. д.

+0

Спасибо. Я попробовал то, что вы предложили. Еще нет безопасности в заголовке. Обычная проверка подлинности работает, как я ожидал бы, однако я абсолютно не понимаю, как передаются учетные данные на сервер. – w0051977

+0

Нет, я этого не делаю. Должен ли он быть BasicHttpBinding для учетных данных, которые должны быть переданы в заголовке? В моем исследовании сообщается, что учетные данные передаются в сообщении SOAP (зашифрованном) с помощью wsHttpBinding. Я совершенно новичок в этом. – w0051977

+0

Какое обязательное использование используется? Что такое режим безопасности? – w0051977

 Смежные вопросы

  • Нет связанных вопросов^_^