Sto strappando i capelli fuori su questo, Ho un servizio WCF che posso chiamare tramite il browser e funziona bene, quando lo chiamo io dall'applicazione web con il metodo seguente ottengo un errore (401) non autorizzato. E il servizio non viene chiamato. Inoltre, quando eseguo la mia applicazione Web dalla mia macchina locale (modalità di debug con IIS Express) puntata sul mio server di sviluppo (IIS7) funziona, ma quando distribuisco la mia applicazione Web sul server di sviluppo e la indirizzo ai servizi del server di sviluppo fallisce con l'errore 401. Penso che questo sia qualcosa a che fare con IIS7 ma non sono sicuro al 100% e l'aiuto sarebbe super utile.Non passare credenziali per servizio WCF con una conseguente 401
Ho guardato on-line per le risposte, ma finora il migliore che ho trovato è this.
La mia chiamata di servizio è il seguente:
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;
La mia configurazione per il servizio è simile al seguente:
<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>
ho messo un po 'di registrazione sul chiamata di servizio del cliente, poco prima chiamo il servizio, la risposta è:
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)
Il codice si presenta come:
logger.Debug("Passing Login: "
+ System.Security.Principal.WindowsIdentity.GetCurrent().Name)
Anche quando ho impostato l'AppPool per il mio sito al mio account di dominio è non mi ancora autorizza per accedere al servizio WCF, ma ancora una volta: si sta lavorando per il browser . Così strano!
Non è sempre facile ottenere il funzionamento dell'autenticazione di WCF e Windows. Prova Fiddler sul client per tracciare il flusso http. Prova anche a configurare la traccia WCF sul server: http://msdn.microsoft.com/en-us/library/ms733025.aspx – Joe