2014-01-21 13 views
1

我有一個程序,它有一個wcf服務與其他模塊進行通信。我想實施自定義授權和身份驗證。對不起,代碼錯誤。下面是它: 服務器:WCF驗證錯誤連接到IP地址

配置:

 <behaviors> 
      <serviceBehaviors> 
      <behavior name="managementMexBehavior"> 

      <serviceMetadata httpGetEnabled="True" httpGetUrl="http://localhost:7538/management/mex"/> 
      <serviceDebug includeExceptionDetailInFaults="True"/> 

      <serviceDiscovery> 
       <announcementEndpoints> 
        <endpoint kind="udpAnnouncementEndpoint"/> 
       </announcementEndpoints> 
      </serviceDiscovery> 

      </behavior>     
      </serviceBehaviors> 
     </behaviors>   

     <binding name="managementServerBindingConfig" closeTimeout="00:10:00" 
     openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" 
     transferMode="Buffered" maxReceivedMessageSize="65535"> 
      <security mode="TransportWithMessageCredential"> 
       <message clientCredentialType="UserName" /> 
      </security> 
     </binding> 

代碼

 var binding = new NetTcpBinding("managementServerBindingConfig"); 
     binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName; 

     string address = _c24ServerAdminSettings.ManagementWebServerAddress; 

     ServiceEndpoint endpoint = Host.AddServiceEndpoint(ServiceInterface, binding, address); 
     endpoint.Name = "C24ServerAdminManagementEndpoint"; 

     var parametrInspector = new OperationParametrInspector(); 

     var errorHandler = new DispatcherErrorHandler(); 
     errorHandler.OnHandleError += errorHandler_OnHandleError; 
     var behavior = new EnpointDispathcherBehavior(parametrInspector, errorHandler); 
     endpoint.Behaviors.Add(behavior); 

     //ServiceCredentials 
     ServiceCredentials scb = Host.Description.Behaviors.Find<ServiceCredentials>(); 
     if (scb == null) 
     { 
      scb = new ServiceCredentials(); 
      Host.Description.Behaviors.Add(scb); 
     } 
     scb.UserNameAuthentication.UserNamePasswordValidationMode = UserNamePasswordValidationMode.Custom; 
     scb.UserNameAuthentication.CustomUserNamePasswordValidator = new PasswordValidator(_dataManager); 
     scb.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindBySubjectName, "localhost"); 


     //ServiceAuthorizationBehavior 
     ServiceAuthorizationBehavior sab = Host.Description.Behaviors.Find<ServiceAuthorizationBehavior>(); 
     if (sab == null) 
     { 
      sab = new ServiceAuthorizationBehavior(); 
      Host.Description.Behaviors.Add(sab); 
     } 

     sab.PrincipalPermissionMode = PrincipalPermissionMode.Custom; 
     sab.ExternalAuthorizationPolicies = new ReadOnlyCollection<IAuthorizationPolicy>(new[] 
                         { 
                          new AuthorizationPolicy() 
                         }); 

客戶:

配置:

<binding name="C24ServerAdminManagementEndpoint" closeTimeout="00:01:00" 
       openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
       transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" 
       hostNameComparisonMode="StrongWildcard" listenBacklog="10" 
       maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10" 
       maxReceivedMessageSize="65536"> 
       <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
        maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
       <reliableSession ordered="true" inactivityTimeout="00:10:00" 
        enabled="false" /> 
       <security mode="TransportWithMessageCredential"> 
        <message clientCredentialType="UserName" /> 
       </security> 
      </binding> 

    <endpoint address="net.tcp://localhost:60001/Management/" binding="netTcpBinding" 
      bindingConfiguration="C24ServerAdminManagementEndpoint" contract="C24ServerAdminManagement.IManagementWebService" 
      name="C24ServerAdminManagementEndpoint"> 
      <identity> 
       <dns value="localhost" /> 
      </identity> 
     </endpoint> 

代碼:

ManagementWebServiceClient ds = new ManagementWebServiceClient("C24ServerAdminManagementEndpoint", _managementServiceAddress); 
     ds.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None; 
     ds.ClientCredentials.UserName.UserName = UserName; 
     ds.ClientCredentials.UserName.Password = Password; 
     ds.Open(); 

這個工作和localhost很好。但是當我設置計算機IP地址。客戶端試圖連接到服務,服務響應和異常發生。例外說,當我們從DNS(192.168.0.1)等待時,從DNS(本地主機)收到的響應。但192.168.0.1是本地地址。

+0

客戶端配置將終點作爲本地主機。這是一個錯字還是真的嗎? – ViSu

回答

0

問題出在了DNS身份。我使用了localhost證書。而當我連接使用直接IP服務從證書返回DNS。實際上在配置中添加DNS身份應該已經解決了這個問題。也許它沒有修復,因爲我在代碼中創建了端點,它加載了綁定配置但不是端點。我重寫代碼只是一點點

 string address = _managementServiceAddress; 
     EndpointAddress epa = new EndpointAddress(new Uri(address), EndpointIdentity.CreateDnsIdentity("localhost")); 
     ManagementWebServiceClient ds = new ManagementWebServiceClient("C24ServerAdminManagementEndpoint", epa); 
     ds.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None; 
     ds.ClientCredentials.UserName.UserName = UserName; 
     ds.ClientCredentials.UserName.Password = Password; 

它工作正常。

0

我遇到了同樣的問題「......如果客戶端和主機位於同一臺計算機上,但是如果主機和客戶端位於不同的計算機上,則會發生異常錯誤」。

這是爲我解決了這個問題:我的互聯網連接設置使用代理服務器。我將局域網設置的IE選項更改爲Bypass proxy server for local addressesDo not use proxy server for addresses beginning with: http:\\host-ip-here

祝你好運。