2012-05-29 2 views
1

У меня есть службы WCF с привязкой Net.Tcp, моя конфигурация сервераWCF Net.Tcp Связывание и customUserNamePasswordValidatorType

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name=""> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug httpHelpPageEnabled="true" includeExceptionDetailInFaults="true"/> 
      <serviceCredentials> 
      <userNameAuthentication userNamePasswordValidationMode="Custom" 
       customUserNamePasswordValidatorType="Service.PlainUserNameValidator, Service" /> 
      </serviceCredentials> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <services> 
     <service name="Service.TestService"> 
     <endpoint address="" binding="netTcpBinding" contract="Service.ITestService"> 
      <identity> 
      <dns value="localhost" /> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     <host> 
      <baseAddresses> 
      <add baseAddress="net.tcp://localhost:8732/Service/TestService/" /> 
      <add baseAddress="http://localhost:8001/service/TestServiceMex/" /> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    </system.serviceModel> 
</configuration> 

В конфигурации я включил customUserNamePasswordValidatorType. Код для запуска хоста

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (ServiceHost host = new ServiceHost(typeof(TestService))) 
     { 
      host.Open(); 
      Console.WriteLine("The service is ready."); 
      Console.WriteLine(String.Format("Metadata is at {0}?WSDL", host.Description.Endpoints[0].Address)); 
      Console.WriteLine(); 
      Console.WriteLine("Press <ENTER> to terminate service."); 
      Console.WriteLine(); 
      Console.ReadLine(); 
     } 
    } 
} 

И мой заказ имя пользователя валидатор класс зарегистрирован в конфигурационном файле

namespace Service 
{ 
    using System; 
    using System.IdentityModel.Selectors; 

    public class PlainUserNameValidator : UserNamePasswordValidator 
    { 
     public override void Validate(string userName, string password) 
     { 
      Console.WriteLine("Requesting username {0} and password {1}.", userName, password); 
     } 
    } 
} 

Однако валидатор кажется, никогда не срабатывает, пока клиент звонит.

Любые специальные уловки, которые необходимо отметить, чтобы включить customUserNamePasswordValidatorType для Net.Tcp переплет?

ответ

1

Две точки:

У Вас нет включен сертификат, вы должны сделать так, чтобы гарантировать целостность учетных данных клиента, установить временный, если Вы должны добавить это учетные данные службы.

<serviceCertificate 
      findValue="localhost" 
      x509FindType="FindBySubjectName" 
      storeLocation="CurrentUser" 
      storeName="My" /> 

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

<netTcpBinding> 
    <binding name="tcpWithMessageSecurity"> 
    <security mode="Message" > 
     <message clientCredentialType="UserName"/> 
    </security> 
    </binding> 
</netTcpBinding> 

затем

<endpoint address="" binding="tcpWithMessageSecurity" contract="Service.ITestService"> 

Затем назовите свое поведение и добавьте его в приведенную выше строку.

+0

Спасибо, я попробую. – hardywang

+0

@hardywang это сработало? – Chris