2013-09-30 11 views
7

führt. Ich reiße mir die Haare aus, ich habe einen WCF-Dienst, den ich über den Browser aufrufen kann und es funktioniert einwandfrei, wenn ich ihn von der Webanwendung aus anrufe die folgende Methode bekomme ich eine (401) Unauthorized Fehler. Und der Service wird nicht angerufen. Wenn ich meine Web-Anwendung von meinem lokalen Rechner (Debug-Modus mit IIS Express) auf meinen Dev-Server (IIS7) zeige, funktioniert es aber, wenn ich meine Web-Anwendung auf dem Dev-Server deploye und auf den Dev-Server diene scheitert mit dem Fehler 401. Ich denke, dass dies etwas mit IIS7 zu tun hat, aber ich bin nicht 100% sicher und Hilfe wäre super nützlich.Ich übergebe keine Zugangsdaten zum WCF Service, was zu einem 401

Ich habe online nach den Antworten gesucht, aber bis jetzt das Beste, was ich gefunden habe, ist this.

Mein Service-Aufruf lautet wie folgt:

var request = (HttpWebRequest) WebRequest.Create(url); 
request.Method = "GET"; 
request.ContentType = "application/json; charset=utf-8"; 
request.AuthenticationLevel = AuthenticationLevel.MutualAuthRequested; 
request.Credentials = CredentialCache.DefaultCredentials; 

WebResponse responce = request.GetResponse(); 
Stream reader = responce.GetResponseStream(); 

var sReader = new StreamReader(reader); 
string outResult = sReader.ReadToEnd(); 
sReader.Close(); 

var result = (T) JsonConvert.DeserializeObject(outResult, typeof (T)); 
return result; 

Meine Konfiguration für den Service sieht wie folgt aus:

<service name="RGMPServices.Householding.Services.AccountService" behaviorConfiguration="Default"> 
    <endpoint address="" kind="webHttpEndpoint" endpointConfiguration="SecuredHttpEndpointBinding" contract="RGMPServices.Householding.Contracts.IAccountService" /> 
    </service> 

    <service name="RGMPServices.Householding.Services.HouseholdService" behaviorConfiguration="Default"> 
    <endpoint address="" kind="webHttpEndpoint" endpointConfiguration="SecuredHttpEndpointBinding" contract="RGMPServices.Householding.Contracts.IHouseholdService" /> 
    </service> 

    <service name="RGMPServices.Householding.Services.UserService" behaviorConfiguration="Default"> 
    <endpoint address="" kind="webHttpEndpoint" endpointConfiguration="SecuredHttpEndpointBinding" contract="RGMPServices.Householding.Contracts.IUserService" /> 
    </service> 
</services> 

<behaviors> 
    <endpointBehaviors> 
    <behavior name="webBehaviour"> 
     <webHttp /> 
    </behavior> 
    </endpointBehaviors> 
    <serviceBehaviors> 
    <behavior name="Default"> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 

<standardEndpoints> 
    <webHttpEndpoint> 
    <standardEndpoint name="SecuredHttpEndpointBinding" helpEnabled="true" automaticFormatSelectionEnabled="true"> 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Windows" /> 
     </security> 
    </standardEndpoint> 
    </webHttpEndpoint> 
</standardEndpoints> 

ich auf dem Client-Service-Aufruf einige Protokollierung gesetzt haben, kurz bevor Ich rufe den Service an, die Antwort lautet:

DEBUG 2013-10-01 13:15:13,569 452ms ServiceGetSingle - Passing Login: MYLANDOMAIN\MYLANUSERNAME

ERROR 2013-10-01 13:15:13,631 514ms ServiceGetSingle - ERROR Calling ServiceGetSingle with user credentials login: MYLANDOMAIN\MYLANUSERNAME System.Net.WebException: The remote server returned an error: (401) Unauthorized. at System.Net.HttpWebRequest.GetResponse() at Householding.Common.ServiceHelper.ServiceGetSingle[T](String url)

Der Code sieht so aus:

logger.Debug("Passing Login: " 
    + System.Security.Principal.WindowsIdentity.GetCurrent().Name) 

Auch wenn ich die AppPool für meine Website zu meinem Domain-Konto ist es immer noch die Genehmigung mich nicht den WCF-Dienst zugreifen zu können, aber auch hier: es ist für den Browser arbeiten . So seltsam!

+0

Es ist nicht immer einfach, die WCF- und Windows-Authentifizierung zu erhalten. Versuchen Sie Fiddler auf dem Client, um den http-Ablauf zu verfolgen. Versuchen Sie auch, die WCF-Ablaufverfolgung auf dem Server zu konfigurieren: http://msdn.microsoft.com/en-us/library/ms733025.aspx – Joe

Antwort

1

Es scheint wahrscheinlich, dass Sie ein Opfer des Doppel-Hop-Problems sind, wenn Sie Integrated Windows Authentication (IWA) und Kerberos verwenden. Der erste Hop ist von Ihrem Browser zur Webanwendung; Der zweite Hop ist von Ihrer Webanwendung zum WCF-Dienst.

Hier sind einige Ressourcen, die das Problem ausführlicher erklären, und eine Lösung anbieten kann:

Sie Active Directory konfigurieren können Kerberos delegation unterstützen (Normalerweise mögen die Infrastruktur-Leute das nicht), oder du könntest den Identitätswechsel und uns ausschalten e Ein "Dienst" -Konto für die Webanwendung und den IIS-Anwendungspool, die sich im Namen des Endbenutzers mit dem WCF-Dienst authentifizieren können.

1

Wie lauten die Standardanmeldeinformationen auf dem Dev-Server? Versuchen Sie, ein Protokoll genau dort zu machen und zu sehen, was Sie bekommen.

Das ist, was ich vermute: lokal ausgeführt werden, die Anmeldeinformationen sind Ihre Windows-Kredits. Wenn Sie den Dev-Server von Dev aufrufen, sind die Anmeldeinformationen das Konto, unter dem die Website ausgeführt wird. Wenn dieser bestimmte Account keinen Zugriff hat, würde er explodieren.

+0

AKTUALISIERT DAS PROBLEM – Joshy

+0

Ist das Protokoll, wenn Sie die Anwendung vom Dev-Server ausführen? –

+0

Ja, es ist vom Dev-Server – Joshy

1

Wie sie zuvor gesagt haben, sieht dies wie ein Problem mit dem Identitätswechsel aus. Haben Sie versucht, das Client-Programm mit "Ausführen als" zu starten, um die Anmeldeinformationen zu ändern?

Zusätzlich können Sie diese Codezeile ändern

request.Credentials = CredentialCache.DefaultCredentials; 

zu

request.Credentials = new NetworkCredential("MyUsername", "MyPassword"); 

Und sehen, ob es funktioniert. Außerdem müssen Sie das Konto "MyUserName" mit "MyPassword" auf dem Webserver erstellen, damit es funktioniert.

1

Diese Fehler können verursacht werden, wenn der authentifizierte Benutzer keinen Zugriff auf den physischen Pfad hat, auf dem der WCF-Dienst gehostet wird. Öffnen Sie auf dem Dev-Server den IIS-Manager, und navigieren Sie zum virtuellen Verzeichnis für den Dienst. Klicken Sie rechts in der Aktionsleiste auf "Grundeinstellungen". Klicken Sie unter dem Textfeld "Physical Path" auf "Connect as ...". Wählen Sie "Spezifischer Benutzer" und versuchen Sie, es auf ein Benutzerkonto zu setzen, von dem Sie wissen, dass es über Rechte für den physischen Ordner auf dem Dev-Server verfügt. In der Regel ist dies ein Dienstkonto, dessen Kennwort nicht abläuft.

1

Beim Ausführen vom Browser sendet der Browser Ihre Authentifizierungsdaten. Außerdem wird iis express als angemeldeter Benutzer ausgeführt, sodass auch Ihre Anmeldeinformationen gesendet werden. Iis ist anders, es wird als lokaler Account ausgeführt. Selbst wenn Sie eine Authentifizierung an Ihrem Frontend haben, wird diese nicht an das Backend weitergegeben. Windows-Identitätswechsel-Token sind in der Anzahl der zulässigen Hops begrenzt, normalerweise 0. Dies wird durchgeführt, um genau das zu verhindern, was Sie tun. Wenn Sie möchten, dass die Front-End-Authentifizierung in das Back-End einfließt, sollten Sie die Authentifizierung wahrscheinlich selbst durchführen und den Benutzer/die Person auf dem Weg dorthin mitnehmen. Alternativ können Sie, wenn Sie die Authentifizierung selbst durchführen, ein Identitätswechsel-Token erstellen, das einen Sprung zu einem anderen Computer ermöglicht, und es sollte funktionieren.