2010-09-01 1 views
8

У меня есть простой сервис, и я пытаюсь настроить аутентификацию. На клиенте я хочу, чтобы пользователь вводил учетную запись пользователя Windows. И WCF будет использовать имя пользователя/пароль, предоставленное клиентом, и аутентифицировать их на основе проверки подлинности Windows.Аутентификация безопасности WCF

Вот мой сервер app.config

<system.serviceModel> 
    <services> 
     <service name="WcfService.Service1" behaviorConfiguration="WcfService.Service1Behavior"> 
     <host> 
      <baseAddresses> 
      <add baseAddress = "http://localhost:8731/Design_Time_Addresses/WcfService/Service1/" /> 
      </baseAddresses> 
     </host> 
     <endpoint address ="" binding="wsHttpBinding" contract="WcfService.IService1"> 
      <identity> 
      <dns value="localhost"/> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="WcfService.Service1Behavior"> 
      <serviceMetadata httpGetEnabled="True"/> 
      <serviceDebug includeExceptionDetailInFaults="True" /> 

      <serviceCredentials> 
      <userNameAuthentication userNamePasswordValidationMode = "Windows"/> 
      </serviceCredentials> 

     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 

Вот мой клиент app.config

<system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
      <binding name="WSHttpBinding_IService1"> 

       <security mode = "Message"> 
       <message clientCredentialType = "UserName"/> 
       </security> 

      </binding> 
     </wsHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost:8731/Design_Time_Addresses/WcfService/Service1/" 
      binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IService1" 
      contract="ServiceReference1.IService1" name="WSHttpBinding_IService1"> 
      <identity> 
       <dns value="localhost" /> 
      </identity> 
     </endpoint> 
    </client> 
</system.serviceModel> 

Вот мой код на клиенте

ServiceReference1.Service1Client client = new WcfAuthentication.ServiceReference1.Service1Client(); 

client.ClientCredentials.UserName.UserName = "mywindowsusername"; 
client.ClientCredentials.UserName.Password = "mywindowsuserpassword"; 
Console.WriteLine(client.GetData(5)); 

Но я всегда получая это исключение:

{«Безопасный канал нельзя открыть, поскольку согласование безопасности с удаленной конечной точкой не удалось. Это может быть связано с отсутствием или неверным указанием EndpointIdentity в EndpointAddress, используемом для создания канала. Убедитесь, что EndpointIdentity, указанный или подразумеваемый EndpointAddress, правильно идентифицирует удаленную конечную точку. «} {» Запрос на маркер безопасности имеет недопустимые или деформированные элементы "}

ответ

7

Похоже, вы сгенерировали конфигурации и конфигурации клиента отдельно (вручную). Обычно рекомендуется создавать клиентскую конфигурацию из службы с использованием svcutil или Visual Studio 'Add Service Reference'. Таким образом, вы знаете, что получаете конфигурацию клиента, соответствующую

Возможно, вы захотите, но WCF не позволяет передавать токен имени пользователя/пароля при использовании wsHttpBinding. Это означает, что вы должны либо разместить свою службу с помощью https, либо использовать сертификат службы. Here - сообщение с более подробной информацией.

Но я также удивляюсь, почему вы хотите чего-то подобного. Возможно, лучше использовать интегрированную проверку подлинности Windows. Это даже значение по умолчанию для wsHttpBinding. Таким образом, вам не нужен ваш клиент (ы) для ввода имени пользователя/пароля Windows.

+1

Интересно, имеет смысл, что он должен использовать безопасное соединение. Это просто упражнение, чтобы понять различные возможности аутентификации, предлагаемые wcf. В реальном мире. Это для моего мобильного приложения, которое пользователю необходимо будет предоставить учетные данные учетной записи Windows на своем мобильном устройстве. Поэтому он использует basichttpbinding и для обеспечения связи, которое я собираюсь использовать с SSL (https). Так, например, выше, используя nettcpbinding, должно быть правильно, так как я думаю, что по умолчанию используется безопасность транспорта, которая уже должна быть зашифрована с помощью tcp. – pdiddy

-2
binding.Security = new WSHttpSecurity{Mode = SecurityMode.None}; 

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

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