UserNamePasswordValidator и сертификат - PullRequest
2 голосов
/ 05 апреля 2011

У меня есть веб-сервис, использующий связывание net tcp и пользовательский UserNamePasswordValidator. Имя пользователя и пароль отправляются клиентом в Credentials.UserName.UserName и Credentials.UserName.Password. Мой сервисный хост настроен следующим образом:

host.Credentials.UserNameAuthentication.UserNamePasswordValidationMode = UserNamePasswordValidationMode.Custom;             host.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = myCustomValidator;
host.Authorization.PrincipalPermissionMode = PrincipalPermissionMode.Custom;

Отлично работает, если используются привязки SecurityMode = TransportWithMessageCredential и ClientCredentialType = MessageCredentialType.UserName, но для этого требуется сертификат.

Я хочу заставить его работать без сертификата. Если я изменил привязку SecurityMode на None, служба запустилась, но мой класс UserNamePasswordValidator так и не был вызван.

Я пробовал SecurityMode = Message и SecurityMode.Transport, и в обоих случаях для запуска службы требовался сертификат.

Я что-то упустил? Всегда ли пользовательский валидатор имени пользователя и пароля требует сертификат?

1 Ответ

2 голосов
/ 28 июля 2011

К сожалению, WCF не позволяет вам отправлять имя пользователя / пароль по сети в виде простого текста. Вы все еще можете это сделать, но для этого требуется создать пользовательскую привязку, как этот парень сделал здесь . Это означает, что вам придется использовать сертификат для шифрования. Обратите внимание, что это не то же самое, что аутентификация сертификата, так что не запутайтесь в этом отношении. Все это означает, что вы должны установить сертификат, который предоставляет открытый ключ. Итак, ваш серверный конфиг будет выглядеть так:

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

...

      <serviceBehaviors>
        <behavior name="CustomPasswordAuthentication">
          <serviceMetadata httpGetEnabled="true" httpGetUrl="" />
          <serviceDebug includeExceptionDetailInFaults="true" />
          <serviceCredentials>
            <serviceCertificate findValue="MyCertificateName" x509FindType="FindBySubjectName" storeLocation="LocalMachine" storeName="Root" />
            <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="MyCompany.WebServices.CustomUsernamePasswordValidator, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>

Конец клиента:

client.ClientCredentials.UserName.UserName = "hello";
client.ClientCredentials.UserName.Password = "hello";
client.ClientCredentials.ServiceCertificate.Authentication.RevocationMode = X509RevocationMode.NoCheck;
client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerOrChainTrust;
client.Open();

Надеюсь, это поможет. РЕДАКТИРОВАТЬ: Просто измените wsHttpBinding на TCP или что вы используете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...