2013-09-30 38 views
7

Rozdzierałem moje włosy na tym, mam usługę WCF, którą mogę wywoływać za pośrednictwem przeglądarki i działa dobrze, kiedy nazywam ją z aplikacji internetowej z poniższa metoda otrzymuję błąd (401) Nieautoryzowany. Usługa nie zostanie wywołana. Co więcej, kiedy uruchamiam moją aplikację internetową z mojego komputera lokalnego (tryb debugowania za pomocą IIS Express) wskazałem na mój serwer dev (IIS7), działa, ale kiedy wdrażam moją aplikację internetową do serwera dev i kierujemy ją do usług serwera dev, to zawiedzie z błędem 401. Myślę, że to ma coś wspólnego z IIS7, ale nie jestem w 100% pewny, a pomoc byłaby bardzo przydatna.Nie przekazanie danych uwierzytelniających do usługi WCF powodujących 401

Szukałem odpowiedzi w Internecie, ale jak dotąd najlepszym znaleziskiem jest this.

Moje wezwanie serwisu jest następujący:

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; 

Moja konfiguracja dla usługi wygląda następująco:

<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> 

Włożyłem trochę rejestrowanie na wezwanie obsługi klienta, tuż przed Zadzwonię do usługi, odpowiedź:

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)

Kod wygląda następująco:

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

Nawet kiedy ustawić AppPool na mojej stronie mojego konta domeny nadal nie upoważniające mnie do dostępu do usług WCF, ale znowu: to działa w przeglądarce . Bardzo dziwne!

+0

Nie zawsze jest łatwo uzyskać poprawne działanie WCF i Windows. Wypróbuj Fiddlera na kliencie, aby prześledzić przepływ http. Spróbuj również skonfigurować śledzenie WCF na serwerze: http://msdn.microsoft.com/en-us/library/ms733025.aspx – Joe

Odpowiedz

1

Wygląda na to, że jesteś ofiarą problemu podwójnego przeskoku podczas używania Integrated Windows Authentication (IWA) i Kerberos. Pierwszy skok pochodzi z przeglądarki do aplikacji internetowej; drugi skok pochodzi z twojej aplikacji internetowej do usługi WCF.

Oto niektóre zasoby, które wyjaśniają kwestię pełniej i może zaoferować rozwiązanie:

można skonfigurować usługę Active Directory w celu wspierania Kerberos delegation (zwykle faceci w infrastrukturze tego nie lubią) lub możesz wyłączyć podszywanie się pod nas e konto "usługi" dla aplikacji internetowej i puli aplikacji IIS, które mogą uwierzytelniać za pomocą usługi WCF w imieniu użytkownika końcowego.

1

Jakie są domyślne dane uwierzytelniające na serwerze Dev? Spróbuj zrobić dziennik i zobacz, co otrzymasz.

Podejrzewam, że: działa lokalnie, poświadczenia są kredytami systemu Windows. Gdy wywołasz serwer dev z dev, dane uwierzytelniające będą takie same, jak konto na którym działa strona. Jeśli to konkretne konto nie będzie miało dostępu, to zostanie wysadzone w powietrze.

+0

ZAKTUALIZOWANO PROBLEMU – Joshy

+0

Czy to jest dziennik, gdy uruchamiasz aplikację z serwera dev? –

+0

tak jest z serwera dev – Joshy

1

Jak już mówiono, wygląda to na problem z podszywaniem się. Czy próbowałeś uruchomić program klienta z "uruchom jako", aby zmienić poświadczenia?

Dodatkowo można zmienić tę linię kodu

request.Credentials = CredentialCache.DefaultCredentials; 

do

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

i sprawdzić, czy to działa. Musisz również utworzyć konto "MyUserName" za pomocą "MyPassword" na serwerze WWW, aby działało.

1

Te błędy mogą być spowodowane, gdy uwierzytelniony użytkownik nie ma dostępu do fizycznej ścieżki, na której hostowana jest usługa WCF. Na serwerze dewelopera otwórz Menedżera usług IIS i przejdź do katalogu wirtualnego usługi. Po prawej stronie na pasku działań kliknij "Ustawienia podstawowe". Poniżej pola tekstowego "Ścieżka fizyczna" kliknij "Połącz jako ...". Wybierz "Określony użytkownik" i spróbuj ustawić go na konto użytkownika, które znasz ma prawa do fizycznego folderu na serwerze dev. Zazwyczaj jest to konto usługi, którego hasło nie wygasa.

1

Podczas uruchamiania z przeglądarki przeglądarka wysyła twoje poświadczenia uwierzytelniające. Ekspres iis będzie również działał jako zalogowany użytkownik, więc wysyłane są również twoje poświadczenia. Iis jest inny, będzie działał jako konto lokalne. Nawet jeśli masz uwierzytelnianie na swoim interfejsie, nie zostanie ono przekazane do zaplecza. Liczba żetonów podszywania się pod Windows jest ograniczona dozwoloną liczbą skoków, zwykle 0. Ma to na celu zapobieganie dokładnie temu, co robisz. Jeśli chcesz, aby uwierzytelnianie z przodu działało na zapleczu, prawdopodobnie powinieneś sam przeprowadzić uwierzytelnianie i przechwycić użytkownika/przepustkę w drodze. Alternatywnie, jeśli sam wykonasz uwierzytelnienie, możesz utworzyć token personifikacji, który pozwala przeskoczyć na inną maszynę i powinien działać.