2010-02-05 5 views
7

Ich habe einen WCF-Webdienst und einen Client auf demselben Computer. Der direkte Zugriff auf den WCF-Webdienst mithilfe des Browsers funktioniert, der Client kann jedoch keine Verbindung herstellen. Fehlermeldung unten. Irgendwelche Ideen? Integrierte Windows-Authentifizierung in IIS wird für Client und Server verwendet.(401) Nicht autorisierter Fehler: WCF-Sicherheit/Bindung

The remote server returned an error: (401) Unauthorized. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.Net.WebException: The remote server returned an error: (401) Unauthorized. 

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below. 

Stack Trace: 

[WebException: The remote server returned an error: (401) Unauthorized.] 
    System.Net.HttpWebRequest.GetResponse() +5313085 
    System.ServiceModel.Channels.HttpChannelRequest.WaitForReply(TimeSpan timeout) +54 

[MessageSecurityException: The HTTP request is unauthorized with client authentication scheme 'Negotiate'. The authentication header received from the server was 'Negotiate,NTLM'.] 
    System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) +7594687 
    System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) +275 
    HRPaysService.IService1.GetAlert() +0 
    HRPaysService.Service1Client.GetAlert() +15 
    _Default.Page_Load(Object sender, EventArgs e) +138 
    System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +14 
    System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +35 
    System.Web.UI.Control.OnLoad(EventArgs e) +99 
    System.Web.UI.Control.LoadRecursive() +50 
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +627 

Auftraggeber:

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
      <binding name="basicBinding"> 
       <security mode="TransportCredentialOnly"> 
        <transport clientCredentialType="Windows" 
          proxyCredentialType="Windows" realm="" /> 
        <message clientCredentialType="UserName" 
          algorithmSuite="Default" /> 
       </security> 
      </binding> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint 
      address="http://hrpaysservice/service1.svc" 
      binding="basicHttpBinding" 
      bindingConfiguration="basicBinding" 
      contract="HRPaysService.IService1"> 
     </endpoint> 
    </client> 
    </system.serviceModel> 

Server:

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="basicBinding"> 
      <security mode="TransportCredentialOnly"> 
       <transport clientCredentialType="Windows" 
          proxyCredentialType="Windows" realm="" /> 
       <message clientCredentialType="UserName" 
         algorithmSuite="Default" /> 
      </security> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint 
      address="http://hrpaysservice/service1.svc" 
      binding="basicHttpBinding" 
      bindingConfiguration="basicBinding" 
      contract="HRPaysService.IService1"> 
     </endpoint> 
</client> 
</system.serviceModel> 
+0

ist Ihr Kunde eine Silverlight-Anwendung durch Zufall ?? Diese funktionieren ganz anders als eine ASP.NET- oder Winforms/WPF-App. –

+0

Nein, keine Silverlight App. –

Antwort

1

Auftraggeber:

<system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
       <binding name="WSHttpBinding_IService1" closeTimeout="00:01:00" 
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
        bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
        maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" 
        textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false"> 
         <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
         maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
         <reliableSession ordered="true" inactivityTimeout="00:10:00" 
         enabled="false" /> 
        <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://localhost:3097/Service1.svc" binding="wsHttpBinding" 
      bindingConfiguration="WSHttpBinding_IService1" contract="HRPaysService.IService1" 
      name="WSHttpBinding_IService1"> 
       <identity> 
        <dns value="localhost" /> 
       </identity> 
     </endpoint> 
    </client> 
</system.serviceModel> 

Server:

<system.serviceModel> 
     <bindings> 
     <basicHttpBinding> 
        <binding name="basicBinding"> 
        <security mode="TransportCredentialOnly"> 
          <transport clientCredentialType="Windows"/> 
        </security> 
       </binding> 
      </basicHttpBinding> 
     </bindings> 
    <services> 
      <service behaviorConfiguration="basicBehavior" name="WcfService1.Service1"> 
       <endpoint address="" binding="basicHttpBinding" contract="WcfService1.IService1" bindingConfiguration="basicBinding" /> 
       <endpoint address="mex" binding="basicHttpBinding" contract="IMetadataExchange" bindingConfiguration="basicBinding" /> 
     </service> 
    </services> 
    <behaviors> 
      <serviceBehaviors> 
       <behavior name="basicBehavior"> 
        <serviceMetadata httpGetEnabled="true" /> 
       </behavior> 
      </serviceBehaviors> 
     </behaviors> 
</system.serviceModel> 

+2

Warum löst das das Problem? Was hast du geändert? – Gusdor

0

Haben Sie eine crossdomain.xml Dokument in Ihre Dienste Web-Anwendung eingerichtet haben? Wenn nicht, erstellen mit folgendem Inhalt -

<?xml version="1.0"?> 
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"> 
<cross-domain-policy> 
    <allow-http-request-headers-from domain="*" headers="*"/> 
</cross-domain-policy> 
+0

keine Ahnung, was das ist? Ich bin auf der gleichen Domain. –

0

Wenn das virtuelle Verzeichnis von WCF-Dienste nicht konfiguriert ist für anonymer Zugriff, dann sollte der Endpunkt "mex" entfernt werden.

Sie haben 2 verschiedene Konfigs-Sets gepostet und es scheint, dass sie nicht übereinstimmen. Können Sie die Configs posten, die den Fehler verursachen?

Ihre erste (oberste) Client-Konfiguration und die neueste Server-Konfiguration (ohne den mex-Teil) sollten funktionieren.

3

Ich habe den gleichen Fehler gefunden, als ich versuchte, auf einen WCF-Dienst auf IIS zuzugreifen, indem ich eine "Service-Referenz" zu meiner Windows Forms-Anwendung hinzufügte. Aber als der Client einen Aufruf für eine Service-Methode schlug, bekam ich "UnAuthorized 401 Exception". Hier ist meine Lösung für dieses Problem:

(1) Ich war mit [wsHttpBinding] schalten sein [Basichttpbinding] wie in der WCF-Service-Konfigurationsdatei folgt:

<system.serviceModel> 
     <bindings> 
      <basicHttpBinding> 
       <binding name="BasicHttpEndpointBinding"> 
        <security mode="TransportCredentialOnly"> 
         <transport clientCredentialType="Windows" /> 
        </security> 
       </binding> 
      </basicHttpBinding> 
     </bindings> 
     <services> 
     <service behaviorConfiguration="ServiceBehavior" name="IService1"> 
      <endpoint address="" binding="basicHttpBinding" 
      bindingConfiguration="BasicHttpEndpointBinding" 
      name="BasicHttpEndpoint" contract="IService1"> 
       <identity> 
        <dns value="localhost" /> 
       </identity> 
      </endpoint> 
      <endpoint address="mex" binding="mexHttpBinding" 
       contract="IMetadataExchange" /> 
     </service> 
    </services> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" 
    multipleSiteBindingsEnabled="true" /> 

(2) Fügen Sie eine "Service-Referenz" von Ihrer Client-Anwendung hinzu und vergeben Sie einen Namen (wir verwenden diesen Namen im folgenden Schritt als "ProxyCalssName")

(3) passen Sie die app.config-Datei der Client-Anwendung auf as an folgt:

<system.serviceModel> 
    <client> 
     <endpoint address="your service URL" 
      binding="basicHttpBinding" bindingConfiguration="basic" contract="ProxyClassName.ServiceName" 
      name="default" /> 
    </client> 
    <bindings> 
     <basicHttpBinding> 
      <binding name="basic"> 
       <security mode="TransportCredentialOnly"> 
        <transport clientCredentialType="Windows" proxyCredentialType="None" 
         realm="" /> 
        <message clientCredentialType="UserName" algorithmSuite="Default" /> 
       </security> 
      </binding> 
     </basicHttpBinding> 
    </bindings> 
</system.serviceModel> 

(4) In dem Code hinter der Client-Anwendung:

 ProxyClassName.MyServiceName srv = new ProxyClassName.MyServiceName("default"); 
//default is the name of the endpoint in the app.config file as we did. 
    srv.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation; 

Good Luck, DigitalFox

+0

Danke für Ihre Antwort.Der Code in Schritt (4) soll die aktuelle Windows-Authentifizierung imitieren, die mit der ursprünglichen Frage übereinstimmt. Ich wollte jedoch auf einen Remote-WCF-Dienst zugreifen. Ihre Client-Konfiguration funktionierte großartig, aber der Code wurde geändert, um AllowedImpersonationLevel = TokenImpersonationLevel.Delegation und srv.ClientCredentials.Windows.ClientCredential.Domain/.Username/.Password auf die entsprechenden Werte zu setzen. – Emanuel

+0

Nachdem ich versucht habe, wsHttpBinding nach einigen Stunden zur Arbeit zu bringen, gab ich endlich auf und probierte diesen Vorschlag aus und ich bekam endlich den Service zur Arbeit. Ich würde gerne wissen, was mit wsHttpBinding los ist, obwohl, wie ich es verstehe, sollte es keine Probleme haben. – Prethen

Verwandte Themen