2013-09-30 35 views
7

ile sonuçlanmıyor Bu saçlarımı yırtıyorum, tarayıcımda arayabileceğimiz bir WCF hizmetim var ve web uygulamasından aradığımda gayet iyi çalışıyor. Aşağıdaki yöntemde bir (401) Yetkisiz hatası alıyorum. Ve servis çağırılmaz. Dahası, web uygulamamı yerel makinemden çalıştırdığımda (IIS Express kullanarak hata ayıklama modu) dev sunucuma (IIS7) işaret ettim, ancak web uygulamamı dev sunucusuna dağıttığımda ve bunu sunucuya yönlendirdiğimde 401 hatası ile başarısız olur. Ben bu IIS7 ile ilgili bir şey olduğunu düşünüyorum ama% 100 emin değilim ve yardım çok yararlı olacaktır.Kimlik bilgilerini WCF Hizmetine aktarma 401

Yanıtları çevrimiçi olarak inceledim, ancak şu ana kadar bulabildiğim en iyi şey this. aşağıdaki gibi

hizmetim çağrısıdır:

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; 

hizmet için My yapılandırma şuna benzer: hemen önce, ben müşteri hizmetleri çağrı üzerine bazı günlük koyduk

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

Hizmetini arıyorum, yanıt:

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)

o tarayıcı için çalışıyor: Ben hâlâ tekrar ama, WCF hizmeti erişmek için bana yetki değildir Alan hesabıma web sitesi için AppPool'u belirlenmiş olsa dahi

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

: gibi

kod görünüyor . Çok garip!

+0

WCF ve windows kimlik doğrulaması çalışmasının yapılması her zaman kolay değildir. Http akışını izlemek için istemcide Fiddler'ı deneyin. Ayrıca, sunucuda WCF izlemeyi yapılandırmayı deneyin: http://msdn.microsoft.com/en-us/library/ms733025.aspx – Joe

cevap

1

Büyük olasılıkla, Integrated Windows Authentication (IWA) ve Kerberos kullanırken çift atlama sorununun kurbanı olduğunuz görülüyor. İlk atlama, tarayıcınızdan web uygulamasına; İkinci atlama, web uygulamanızdan WCF servisine. İşte

daha tam konuyu açıklamak bazı kaynaklar vardır ve bir çözüm sunabilir: Sen Kerberos delegation desteklemek üzere Active Directory yapılandırabilirsiniz

(genellikle altyapı çalışanları bundan hoşlanmazlar), veya kimliğe bürünme özelliğini ve bizi kapatırsınız Web uygulaması ve son kullanıcı adına WCF hizmeti ile kimlik doğrulaması yapabilen IIS uygulama havuzu için bir "hizmet" hesabı.

1

Dev sunucusunda varsayılan kimlik bilgileri nelerdir? Orada bir kayıt yapmayı dene ve aldığın şeyi gör.

Şüphelendiğim şey şudur: Yerel olarak çalışan kimlik bilgileri Windows kredilerinizdir. Dev sunucusunu dev sunucusundan çağırdığınızda, kimlik bilgileri web sitesinin altında çalıştığı hesaplar olur. Eğer bu özel hesabın erişimi yoksa, o zaman havaya uçurdu.

+0

SORUN GİDERME SORUNU – Joshy

+0

Bu işlem, sunucuyu dev sunucusundan çalıştırdığınız zamandan mı geliyor? –

+0

evet dev sunucusundan – Joshy

1

Daha önce nasıl söylediler, bu bir kimliğe bürünme sorunu gibi görünüyor. Kimlik bilgilerini değiştirmek için istemci programını "farklı çalıştır" ile başlatmayı denediniz mi?

Ek olarak

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

kod

request.Credentials = CredentialCache.DefaultCredentials; 

bu çizgiyi değiştirmek Ve eğer çalışırsa görebilirsiniz. Ayrıca, çalışmasını sağlamak için web sunucusundaki "MyPassword" ile "MyUserName" hesabı oluşturmalısınız.

1

Kimliği doğrulanmış kullanıcının WCF hizmetinin barındırıldığı fiziksel yola erişimi olmadığında bu hatalara neden olabilir. Dev sunucusunda, IIS Yöneticisi'ni açın ve hizmet için sanal dizine gidin. Eylemler çubuğunun sağ tarafında, "Temel Ayarlar" a tıklayın. "Fiziksel Yol" metin kutusunun altında, "Bağlan ..." ı tıklayın. "Belirli Kullanıcı" yı seçin ve bunu, dev sunucusundaki fiziksel klasörün haklarına sahip olduğunu bildiğiniz bir kullanıcı hesabına ayarlamayı deneyin. Genellikle, bu parola süresi dolan bir hizmet hesabı olur.

1

Tarayıcıdan çalışırken tarayıcı, kimlik doğrulama bilgilerinizi gönderiyor. Ayrıca, iis express giriş yapmış kullanıcı olarak çalışacaktır, bu aynı zamanda kimlik bilgilerinizi de göndermektedir. Iis farklı, yerel bir hesap olarak çalışıyor olacak. Ön uçunuzda kimlik doğrulamanız olsa bile, bu arka plana aktarılmaz. Windows kimliğine bürünme işaretleri genellikle izin verilen atlama sayısıyla sınırlıdır. Bu, tam olarak ne yaptığınızı engellemek için yapılır. Ön uç kimlik doğrulamasının arka tarafa akmasını istiyorsanız, muhtemelen kimlik doğrulamasını kendiniz yapmanız ve geçişte kullanıcı/geçişi almanız gerekir. Alternatif olarak, kimlik doğrulamasını kendiniz yaparsanız, başka bir makineye atlamayı sağlayan ve işe yarayan bir kimliğe bürünme belirteci oluşturabilirsiniz.