मैंने कई एमएसडीएन लेख और कोडप्लेक्स मार्गदर्शन का पालन किया है लेकिन डब्ल्यूसीएफ को केर्बेरोस प्रमाणीकरण और प्रतिनिधिमंडल के साथ काम करने के लिए नहीं मिल सकता है और थोड़ी मदद की सराहना करता है।डब्ल्यूसीएफ और केर्बेरोज प्रमाणीकरण
सेटअप
मैं एक दूरस्थ मशीन
- पर एक आईआईएस वेबसाइट में WCF सेवा है IIS 6.0 Windows 2003 R2 पर - सपा 2
- मशीन के लिए SPN जोड़ दिया गया है (http/myserver & & http/myserver: 8080)
- आईआईएस ऐप पूल के लिए एक एडी खाता बनाया गया है
- ई खाते की स्थापना, (Kerberos के लिए) के प्रतिनिधिमंडल की अनुमति देते हैं, सच
करने के लिए सेट मैं 8080 पर Brian Booth's debug site का उपयोग कर रहा है और यह साइट Kerberos प्रतिनिधि मंडल के लिए सभी आवश्यकताओं से गुजरता है। डीबग आईआईएस साइट पर अज्ञात प्रमाणीकरण बंद है, और एकीकृत विंडोज प्रमाणीकरण पर है।
मैंने डब्ल्यूसीएफ सेवा की मेजबानी करने वाली साइट पर इन सेटिंग्स को प्रतिबिंबित किया है।
वेब सेवा - वेब कॉन्फ़िग (मूल)
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WsHttpBindingConfig">
<security>
<message negotiateServiceCredential="true" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="ServiceBehavior" name="Service">
<endpoint address=""
binding="wsHttpBinding"
bindingConfiguration="WsHttpBindingConfig"
contract="IService">
<identity>
<servicePrincipalName value="http/myserver" />
<dns value="" />
</identity>
</endpoint>
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
<serviceAuthorization
impersonateCallerForAllOperations="true" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
वेब सेवा - वेब विधि
[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public string GetCurrentUserName()
{
string name = WindowsIdentity.GetCurrent().Name;
return name;
}
क्लाइंट अनुप्रयोग - ऐप कॉन्फ़िग
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_IService"
... />
...
<security mode="Message">
<transport clientCredentialType="Windows"
proxyCredentialType="None"
realm="" />
<message clientCredentialType="Windows"
negotiateServiceCredential="true"
algorithmSuite="Default"
establishSecurityContext="true" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="http://myserver/Service.svc"
binding="wsHttpBinding"
bindingConfiguration="WSHttpBinding_IService"
contract="KerberosService.IService"
name="WSHttpBinding_IService">
<identity>
<servicePrincipalName value="http/myserver" />
</identity>
</endpoint>
</client>
</system.serviceModel>
अनुप्रयोग त्रुटि
निम्न त्रुटि तब होती है जब अपने परीक्षण आवेदन, एक WinForms अनुप्रयोग, वेब विधि कॉल करने की कोशिश करता है:
"HTTP अनुरोध ग्राहक प्रमाणीकरण योजना 'बेनामी' के साथ अनधिकृत है । प्रमाणीकरण हैडर सर्वर से प्राप्त था 'निगोशिएट, NTLM' "
ईवेंट लॉग
निम्न त्रुटि ईवेंट लॉग में है:।
अपवाद: सिस्टम .ServiceModel.ServiceActivationException: सेवा '/Service.svc' संकलन के दौरान अपवाद के कारण सक्रिय नहीं हो सकता है tion। अपवाद संदेश है: इस सेवा के लिए सुरक्षा सेटिंग्स को 'बेनामी' प्रमाणीकरण की आवश्यकता है लेकिन यह आईआईएस एप्लिकेशन के लिए सक्षम नहीं है जो इस सेवा को होस्ट करता है।
जो मुझे समझ में नहीं आता है। इस सेवा का पूरा बिंदु अज्ञात प्रमाणीकरण की अनुमति नहीं देना है, प्रत्येक उपयोगकर्ता/अनुरोध कोर्बेरोज टिकटों का उपयोग करके प्रमाणित किया जाना चाहिए, फिर उन्हें अन्य मशीनों के माध्यम से पास करना होगा।
मैं केर्बेरो प्रमाणीकरण और प्रतिनिधिमंडल के लिए इस डब्ल्यूसीएफ सेवा को कैसे कॉन्फ़िगर करना चाहिए?
संशोधन 1
this SO question पढ़ने के बाद मैं मेटाडाटा endpoint हटा दिया। इसने इस मुद्दे को हल नहीं किया है।
संशोधन 2
अधिक शोध करने के बाद मैं basicHttpBinding को wsHttpBinding बदलने के लिए सुझाव दे कुछ पोस्ट नहीं मिला। Web.config के उस हिस्से में संशोधन को नीचे शामिल किया गया है, और उस बाध्यकारी के संदर्भ में सेवा समापन बिंदु अद्यतन किया गया है।
वेब सेवा - वेब कॉन्फ़िग (संशोधित)
<basicHttpBinding>
<binding name="basicBindingConfig">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows"
proxyCredentialType="Windows"
realm="" />
</security>
</binding>
</basicHttpBinding>
क्लाइंट अनुप्रयोग - ऐप कॉन्फ़िग (संशोधित)
<!-- ... -->
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows"
proxyCredentialType="Windows"
realm="" />
<message clientCredentialType="UserName"
algorithmSuite="Default" />
</security>
<!-- ... -->
त्रुटि (संशोधित)
वर्तमान त्रुटि दिखती है जैसे इसमें एक केर्बेरोस होता है ntication हेडर।
HTTP अनुरोध 'निगोशिएट' ग्राहक प्रमाणीकरण योजना के साथ अनधिकृत है। प्रमाणीकरण हैडर सर्वर से प्राप्त था 'निगोशिएट SOMEHUGESCARYKEYHERE
नोट, मैंने कल कुछ इसी तरह पोस्ट किया और हटा दिया, इस पोस्ट में अधिक शोध के आधार पर संशोधन शामिल हैं और पढ़ने के लिए क्लीनर होना चाहिए। – blu
मैंने marc_s की प्रतिक्रिया के आधार पर संशोधित ऐप कॉन्फ़िगरेशन जोड़ा। – blu