2012-03-13 33 views
14

मैं एक डब्ल्यूसीएफ सेवा लिख ​​रहा हूं प्रतिरूपण और सत्र की आवश्यकता है।
netTCP बाध्यकारी साबुन सुरक्षा बातचीत विफल

यह ठीक है जब मैं अपने स्थानीय मशीन पर यह कॉल करने की कोशिश, लेकिन रिमोट मशीन पर यह हमेशा इस तरह के त्रुटि के साथ विफल:

Security Support Provider Interface (SSPI) authentication failed. The server may not be running in an account with identity 'host/hostname'. If the server is running in a service account (Network Service for example), specify the account's ServicePrincipalName as the identity in the EndpointAddress for the server. If the server is running in a user account, specify the account's UserPrincipalName as the identity in the EndpointAddress for the server.

अगर मैं एक UPN प्रदान की है, फेंक देता है एक पहचान अपवाद में विफल रहा है ।

सर्वर कॉन्फ़िग (एपीपी):

<system.serviceModel>  
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="default"> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
      <serviceAuthorization impersonateCallerForAllOperations="true" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <bindings> 
     <netTcpBinding> 
     <binding name="DataService.netTcpBinding"> 
      <readerQuotas maxArrayLength="65535" maxBytesPerRead="2147483647" maxStringContentLength="2147483647"/> 
      <reliableSession enabled="true" inactivityTimeout="24:00:00" ordered="true"/>   
      <security mode="TransportWithMessageCredential"> 
      <message clientCredentialType="Windows" /> 
      <transport clientCredentialType="Windows"/>   
      </security> 
     </binding> 
     </netTcpBinding> 
    </bindings> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/> 
    <services> 
     <service behaviorConfiguration="default" name="DataService.DataService"> 
     <endpoint address="" binding="netTcpBinding" bindingConfiguration="DataService.netTcpBinding" 
      name="DataService.DataService" contract="DataService.IDataService"/> 
     <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" /> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://address:4504/"/> 
      <add baseAddress="net.tcp://address:4503/"/> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
</system.serviceModel> 

ग्राहक कॉन्फ़िग:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel>  
     <bindings> 
      <netTcpBinding> 
       <binding name="DataService.DataService" 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="24.00:00:00" 
         enabled="true" /> 
        <security mode="TransportWithMessageCredential"> 
         <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" /> 
         <message clientCredentialType="Windows" algorithmSuite="Default" /> 
        </security> 
       </binding> 
      </netTcpBinding> 
     </bindings> 
     <client> 
      <endpoint address="net.tcp://address:4503/" binding="netTcpBinding" 
       bindingConfiguration="DataService.DataService" 
       contract="ataService.IDataService" name="DataService.DataService"> 
       <identity> 
       <dns value="DOMAIN"/>             
       </identity> 
      </endpoint> 
     </client> 
    </system.serviceModel> 
</configuration> 

किसी भी मदद की बहुत सराहना की जाएगी

यहाँ मेरी config है।

उत्तर

19

विंडोज सेवाएं स्वयं को उपयोगकर्ता प्रिंसिपल नेम या सर्विस प्रिंसिपल नेम (documentation) के साथ पंजीकृत करती हैं। उस लिंक से उद्धरण के लिए: "यदि सेवा लोकलसिस्टम, लोकल सर्विस, या नेटवर्क सेवा खाते के अंतर्गत चल रही है, तो सेवा के प्रिंसिपल नेम (एसपीएन) को होस्ट के रूप में डिफ़ॉल्ट रूप से जेनरेट किया जाता है/क्योंकि उन खातों के कंप्यूटर के एसपीएन डेटा तक पहुंच होती है यदि सेवा किसी दूसरे खाते के तहत चल रही है, तो विंडोज कम्युनिकेशन फाउंडेशन (डब्ल्यूसीएफ) यूपीएन को @ के रूप में उत्पन्न करता है "वास्तव में, यह उद्धरण आपके त्रुटि संदेश के बारे में बताता है। तो ऐसा लगता है कि ...

क) यदि सेवा स्थानीय सेवा खाता या इसी तरह के मानक खाते के अंतर्गत चल रहा है, तो आप इस के लिए अपने ग्राहक विन्यास फाइल को समायोजित करने की जरूरत है, जहां वास्तविक सर्वर का नाम है " पता: MyDomain "" डोमेन पर "ServiceAccount)" और अंत बिंदु बंदरगाह 4503 पर चल रहा है

<identity> 
    <servicePrincipalName value="host/address:4503" /> 
</identity> 

ख) बारी-बारी से, अगर आप एक समर्पित सेवा खाते के अंतर्गत चल रहे हैं (यह कॉल ", तो आप

चाहते
<identity> 
    <userPrincipalName value="[email protected]" /> 
</identity> 

कृपया ध्यान दें कि आपको वन और वृक्ष के स्तर सहित दोनों मामलों में पूरी तरह से योग्य डोमेन नाम का उपयोग करने की आवश्यकता हो सकती है। अपने निजी लैन/वैन के अंदर एक साधारण डोमेन के लिए, इसका मतलब पता होगा। MyDomain.local और [email protected]। यदि आपका डोमेन MyTree नामक पेड़ में है तो यह [email protected] होगा; अगर वह मायफॉर्स्ट नामक वन में है तो यह [email protected] (और ServicePrincipalName के समान) होगा। प्रमाणीकरण के लिए पूरी तरह से योग्य नाम when you are using Kerberos की आवश्यकता है।

+1

यह सही है। मैं यह भी जोड़ूंगा कि आईआईएस द्वारा होस्ट की जाने वाली वेब सेवाओं का उपभोग करते समय, पहचान उस ऐप पूल पहचान से मेल खाना चाहिए जो सेवा के अंतर्गत रहती है। यह नेटवर्क सेवा से आईआईएस (शायद 7?) के कुछ संस्करण में बदल दिया गया था (जहां आप 'नेटवर्क सेवा @ मशीन-NAME' के उपयोगकर्ता सिद्धांत का उपयोग ऐपपूल इडेंटिटी) में करेंगे (जहां आप' मेजबान/मशीन-NAME 'के सेवा सिद्धांत का उपयोग करेंगे)। – qJake

6

वहाँ here, here, और here, पोस्ट और here विश्लेषण किया के रूप में, एक गंदा हैक भी है।

आप एक डमी सेवा प्रिंसिपल नेम (एसपीएन) की आपूर्ति कर सकते हैं। उस स्थिति में, डब्ल्यूसीएफ असफल नहीं होगा, लेकिन प्रमाणीकरण के लिए एनटीएलएम पर वापस आना जो प्रिंसिपल को सत्यापित नहीं करता है।

तो, विन्यास:

<identity> 
     <servicePrincipalName value="dummy" > 
    </identity> 

और प्रोग्राम के रूप में

EndpointIdentity identity = EndpointIdentity.CreateSpnIdentity("dummy"); 

ChannelFactory का उपयोग कर:

Uri uri = new Uri("net.tcp://<myServer>:<myPort>/myServiceAddress"); 
    ChannelFactory channelFactory = new ChannelFactory<IMyContract>(new NetTcpBinding()); 
    channelFactory.CreateChannel(new EndpointAddress(uri, identity) 

भी काम करेंगे।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^