2010-11-29 10 views
2

Ich habe zwei Websites auf demselben IIS-Server gehostet. SiteA enthält WCF-Dienste, auf die SiteB zugreifen muss, sowie alles, was in der Domäne authentifiziert wird.Konfigurieren der WCF-Sicherheit (wsHttpBinding)

Der Dienst ist mit einem wsHttpBinding konfiguriert und daher glaube ich, verwendet Windows-Sicherheit standardmäßig. Im Moment kann ich die Dienste von einer Konsolenanwendung aufrufen, die auf meinem lokalen Computer läuft, sowie von einer Webanwendung, die auf dem Standard-Web-Server von Visual Studio ausgeführt wird. Daher nehme ich an, dass die Authentifizierung funktioniert. Wenn SiteB versucht, auf die Dienste zuzugreifen, schlägt es mit diesem Fehler fehl: Der Aufrufer wurde von dem Dienst nicht authentifiziert.

SiteB läuft auf demselben Rechner wie SiteA, daher verstehe ich nicht, warum es nicht authentifiziert werden konnte. SiteB verwendet die Formularauthentifizierung und ich habe den anonymen Zugriff auf einen Domänenbenutzer zugeordnet.

Hier sind die Config-Bits:

WebsiteA (Service):

<system.serviceModel> 
     <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 
     <services> 
      <service behaviorConfiguration="wcfServiceBehaviour" name="MyService"> 
       <endpoint address="" binding="wsHttpBinding" contract="IServiceContract" /> 
       <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
      </service> 
     </services> 
     <behaviors> 
      <serviceBehaviors> 
       <behavior name="wcfServiceBehaviour"> 
        <serviceMetadata httpGetEnabled="true" /> 
        <serviceDebug includeExceptionDetailInFaults="true" /> 
       </behavior> 
      </serviceBehaviors> 
     </behaviors> 
    </system.serviceModel> 

SiteB (Client):

<system.serviceModel> 
    <client> 
     <endpoint address="http://xxxxx/Services/xxService.svc" 
       binding="wsHttpBinding" 
       contract="IServiceContract" /> 
    </client> 
</system.serviceModel> 
+0

Hallo Xavier, ich entschuldige mich, ich war falsch. Ich hatte dieses Teil deutlich vermisst. – Aliostad

Antwort

1

Sie sind richtig - wsHttpBinding in WCF konfiguriert verwendet standardmäßig die Windows-Authentifizierung.

Es gibt einen Vorschlag hier - WCF - changing endpoint address results in securityexception - dass der Identity-Block nicht mit Windows-Authentifizierung funktioniert - versuchen Sie es zu entfernen.

+0

Danke für den Hinweis. Ich habe den Identitätsblock entfernt, aber die Authentifizierung funktioniert immer noch nicht. Ich habe meine Frage bearbeitet, um die Änderungen zu berücksichtigen. –

+1

Haben Sie erwogen, NetNamedPipeBinding anstelle von wsHttpBinding zu verwenden? Diese Bindung ist sicher und für dieselbe Verarbeitung optimiert. Wenn Sie weiterhin externen Zugriff bereitstellen müssen, können Sie die wsHttpBinding-Funktion beibehalten (vorausgesetzt, sie funktioniert für externe Benutzer).Alles, was Sie tun müssen, ist, den Bindungsnamen zu ändern und http: // in net.pipe: // zu ändern. –

+0

Nicht erklären, warum es nicht funktioniert hat, aber es ist trotzdem ein großartiger Vorschlag! –

1

Wenn SiteB die Identität eines anderen Benutzers annimmt, gibt der Code impersonation level an?

Meine Vermutung ist, dass Sie nicht ein hohes Maß an Identitätswechsel angeben. (Die Delegierung ist die höchste, sodass SiteB die Berechtigungen an einen anderen Dienst weitergeben kann).

Ich vermute, dass das Reparieren des SiteB-Identitätswechsel-Codes ausreicht, um das Problem zu lösen.

Wenn nicht, versuchen Sie die zulässige Identitätswechselebene an den Server übergeben:

<system.serviceModel> 
    <client> 
     <endpoint address="http://xxxxx/Services/xxService.svc" 
       binding="wsHttpBinding" 
       contract="IServiceContract" 
       behaviorConfiguration = "ImpersonationBehavior" /> 
    </client> 
     <behaviors> 
      <endpointBehaviors> 
       <behavior name="ImpersonationBehavior"> 
        <clientCredentials> 
         <windows allowedImpersonationLevel = "Delegation" /> <!-- The highest level --> 
        </clientCredentials> 
       </behavior> 
      <endpointBehaviors> 
     </behaviors> 
</system.serviceModel> 
+0

Danke für den Vorschlag. Die Anwendung verwendet die Formularauthentifizierung. Daher dachte ich, dass ein Identitätswechsel in diesem Fall nicht hilfreich wäre. Ich habe es trotzdem ausprobiert, falls der Punkt darin bestand, den anonymen Benutzer auszugeben, aber das hat nicht geholfen. Ich werde Gregs Vorschlag nehmen und NetNamedPipeBinding verwenden und das wsHttpBinding für externe Benutzer belassen. –

0

Wenn Sie eine selbst gehosteten Seite wie ich verwenden, die Art und Weise, dieses Problem zu vermeiden (wie oben beschrieben) ist festgelegt, sowohl auf der Host- als auch auf der Client-Seite, dass der Sicherheitsmodus wsHttpBinding = NONE ist.

Wenn die Bindung zu schaffen, sowohl auf dem Client und dem Host, können Sie diesen Code verwenden:

Dim binding as System.ServiceModel.WSHttpBinding 
binding= New System.ServiceModel.WSHttpBinding(System.ServiceModel.SecurityMode.None) 

oder

System.ServiceModel.WSHttpBinding binding 
binding = new System.ServiceModel.WSHttpBinding(System.ServiceModel.SecurityMode.None); 
Verwandte Themen