2010-11-08 6 views
0

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

web.config

 <serviceCredentials> 
     <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="MyNamespace.CustomUserNameValidator, MyNamespace" /> 
     </serviceCredentials> 

    <wsHttpBinding> 
    <binding name="wsHttpBindingConfig" > 
     <security mode="Message"> 
     <message clientCredentialType="UserName" /> 
     </security> 
    </binding> 
    </wsHttpBinding> 

     <serviceBehaviors> 
    <behavior> 
     <serviceMetadata httpGetEnabled="true"/> 
     <serviceDebug includeExceptionDetailInFaults="true"/> 
    </behavior> 
    </serviceBehaviors> 

Пользовательский класс аутентификации;

public class CustomUserNameValidator : UserNamePasswordValidator 
{ 
    public override void Validate(string userName, string password) 
    { 
     // have security details been provided? 
     if (null == userName || null == password) 
     { 
      throw new ArgumentNullException(); 
     } 

     // authenticate user 
     if (!(userName == "test" && password == "test")) 
     { 
      // This throws an informative fault to the client. 
      throw new FaultException("SecurityFailed"); 
     } 
    } 
} 

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

Зачем это было? Вся помощь была оценена.

ответ

0

Несколько предложений.

  1. WCFTestClient - не лучшее приложение. Вам будет лучше использовать такой инструмент, как SOAPUI (можно загрузить на www.soapUI.org). WCFTestClient не импортирует все параметры конфигурации и не является лучшим методом тестирования.
  2. Когда я использую CustomAuthentication я установил мое стягивание так:

    <wsHttpBinding> 
        <binding name="wsHttpBindingConfig" > 
         <security mode="TransportWithMessageCredentials"> 
         <message clientCredentialType="UserName" /> 
         </security> 
        </binding> 
    </wsHttpBinding> 
    

Я предполагаю, что вы хотели некоторую форму безопасности по линии. Тестирование с самоподписанным сертификатом SSL на вашей машине довольно простое. Более подробная информация о том, как это сделать here.

+0

Matt - TransportWithMessageCredentials то, что я использовал раньше, так что я буду возвращаться к тому, что в любом случае. SoapUi также является инструментом, который я использую, но иногда я нахожу его немного временным. Даже используя SoapUi, я не могу заставить его использовать пользовательскую проверку подлинности. Какие-либо предложения? Кроме того, вы говорите: «Я предполагаю, что вам понравится какая-то форма безопасности по линии». Сертификаты в сторону. Это то, что я пытаюсь реализовать. Сообщения SOAP, которые я получаю, включают информацию заголовка WS-Security с именем пользователя и паролем, именно это я пытаюсь проверить. – Carl

+1

Не могли бы вы также предоставить разделы Full behaviors, endpoint и client (если вы используете один) из вашего web.config? –

1

В строке, где у вас есть

customUserNamePasswordValidatorType="MyNamespace.CustomUserNameValidator, MyNamespace" 

вторая часть типа (вы в настоящее время есть «MyNamespace») должно быть имя узла, содержащего типа, без какого-либо расширения файла.

См. this question для получения дополнительной помощи.

+0

То же самое в моем случае. MyNamespace на самом деле MyCompany.AplicationName.B2B, поэтому сборка называется MyCompany.AplicationName.B2B.dll – Carl

0

Я взял всю информацию, которую вы предоставили, и создал шаблон web.config. Я бы подумал, что это выглядит примерно так.

<system.serviceModel> 
    <services> 
    <service name="<YourNameSpace>.<ServiceName>" <behaviorConfiguration="<YourNameSpace>.<BehaviorName>"> 
     <endpoint 
     address="" 
     binding="wsHttpBinding" 
     bindingConfiguration="wsHttpBindingConfig" 
     contract="<YourNameSpace>.<ServiceInterface>" 
     /> 
     <!--Notice the binding is mexHttpsBinding, default is http--> 
     <endpoint 
     address="mex" 
     binding="mexHttpsBinding" 
     contract="IMetadataExchange" 
     /> 
    </service> 
    </services> 
<behaviors> 
    <serviceBehaviors> 
     <behavior name="<YourNameSpace>.<BehaviorName>"> 
      <!--Notice the httpsGetEnabled, default is http--> 
     <serviceMetadata httpsGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
      <serviceCredentials> 
       <userNameAuthentication 
       userNamePasswordValidationMode="Custom"     
       customUserNamePasswordValidatorType="<YourNameSpace>.CustomUserNameValidator, <YourNameSpace>" 
       /> 
      </serviceCredentials> 
     </behavior> 
    </serviceBehaviors> 
</behaviors> 
<bindings> 
    <wsHttpBinding> 
    <binding name="wsHttpBindingConfig"> 
     <security mode="TransportWithMessageCredential"> 
     <message clientCredentialType="UserName"/> 
     </security> 
    </binding> 
    <wsHttpBinding> 
</bindings>