2009-07-06 13 views
11

Uzak bir WCF web hizmetiyle görüşen bir web sitem var. Her ikisi de aynı özel FormsAuthentication Provider'ı kullanır. Şu anda sitede oturum açmış olan kullanıcının kimliğine bürünen WCF servisi ile kimlik doğrulaması yapmak istiyorum. Bunu, UserName istemci kimlik bilgilerini kullanarak zaten el ile yaptım, ancak kullanıcı parolasını bilmem gerekiyor. Peki çalışır böylece osuruk şudur: doğrulanmış bir kullanıcı bir istekte, onun kimlik bilgilerini bir Servis Client oluşturmak ve set:Form Kimlik Doğrulama çerezini bir WCF hizmetine geçirme

serviceClient.ClientCredentials.UserName.UserName = username; 
serviceClient.ClientCredentials.UserName.Password = password; 

Ama ne gerçekten istiyorum, doğrudan FormsAuthentication çerez geçmesi ı don nedeniyle etmektir kullanıcı şifresini saklamak istiyorum.

Herhangi bir fikrin var mı?

+0

Merhaba Ariel, bununla nasıl başa çıktın? Benzer sorunları olan birini tanıyorum. –

cevap

13

Windows Communication Foundation Authentication Service'u aradığınız gibi görünüyor.

DÜZENLEME: Yukarıdaki öneriyi geri çekmek istiyorum daha dikkatli soruyu tekrar okuma (ve Ariel yorumun sonra) sonra

. WCF Kimlik Doğrulama Servisi bu senaryoya çok fazla eklenmeyecek.

Bunu WCF ve ASP.NET arasında yapmadım, ancak ASP.NET uygulamalarını form kimliği doğrulanmış kullanıcıları paylaşmak üzere yapılandırdım, belki de bir şekilde yardımcı olabilirim.

Her iki uygulamanın da form kimlik doğrulama tanımlama bilgisini aynı şekilde şifrelemek/şifresini çözmek için her iki uygulama için de configure the <machineKey> element'u (makine veya uygulama düzeyinde yapmak istediğinize bağlı olarak web.config veya machine.config dosyasında)). validation, validationKey, decryption ve decryptionKey özniteliklerine bakmalısınız.

Her iki web.config dosyasındaki <forms> öğelerinizin benzer şekilde yapılandırıldığından emin olun. Spesifik olarak name, path ve domain öznitelikleri.

Bu sadece bir web tarayıcısından için/iletilen tanımlama için de geçerlidir (ancak bu durumda yararlı olabilir) büyük olasılıkla: kurabiye web siteleri arasında geçirilecek izin vermek için www.foo.com ve bar.foo .com çerezler diğer bir siteden ayarlanır ve başarılı bir şekilde geçirilmesini sağlamak için aşağıdaki gibi forms elemanı yapılandırmak istiyorum:

<forms ... domain=".foo.com" ... /> 

WCF servisine tanımlama bilgisi geçirmeden karmaşık bit olması muhtemeldir. Çok böylece I've adapted code from kennyw.com, WCF ile deneyimli değilim:

HttpRequestMessageProperty httpRequestProperty = new HttpRequestMessageProperty(); 
httpRequestProperty.Headers.Add(HttpRequestHeader.Cookie, "<Forms Authentication Cookie>"); 

using (OperationContextScope scope = new OperationContextScope(serviceClient.InnerChannel)) 
{ 
    OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpRequestProperty; 
    serviceClient.MethodName(); 
} 

Eğer

ayarlayarak ASP.NET işleme boru hattıyla WCF isteği geçebilir IIS (ve Kendi kendine barındırma) içinde WCF koyduysanız
<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" ... /> 
</system.serviceModel> 

Eğer OperationContext.Current.IncomingMessageProperties gelen mesajın özelliklerini kullanarak istek başlıklarını incelemek ve form kimlik doğrulama tanımlama bilgisi değeri elde ve FormsAuthentication.Decrypt(string) kullanarak şifresini olabilir barındırma kendini iseniz.

Bunlardan herhangi birinin işe yarayıp yaramadığına dair bir fikrim yok, ancak bunu duymak ister!

+0

Kimlik Doğrulama Hizmeti'nin nasıl yardımcı olabileceğini göremiyorum. Benim durumum şudur: USER -> Web Sitesi A -> WCF Service B başka bir yerde barındırılıyor Kullanıcı A, A, Kullanıcı kimlik bilgilerini kullanarak B'ye bir çağrı yapar. Kimlik Doğrulama hizmetini nereye eklersiniz? –

+0

Merhaba Ariel. Üzgünüm, soruyu gerçekten okumadan çok çabuk cevap vermeye çalıştım. Bir güncelleme ile düzenlerim. – dariom

+0

Öneri için teşekkürler, bunu deneyeceğim ve sonuçları burada paylaşacağım. –

4

Kimliği doğrulanmış IIS sitesinde WCF hizmetini barındırıyorsanız, bu yeterince basittir.

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
</system.serviceModel> 

Sonra Şimdi aşağıdaki

[AspNetCompatibilityRequirements(
    RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 

ile çerez kabul etmek istediğiniz her hizmeti süslemeleri web.config içinde System.ServiceModel bölümüne aşağıdaki ekleyerek uyumluluğu etkinleştirme HttpContext.Current.User.Identity nesnesi doğru bir şekilde doldurulacak ve aynı zamanda rol veya belirli kullanıcılara erişimi sınırlamak için PrinciplePermission taleplerini de kullanabilirsiniz.

+0

Eh, sorun şu, aynı IIS'yi kullanamıyorum. İnşa ettiğim sistem için bir gereklilik, web sitesini ve servisini ayrı makinelerde barındırmaktı. Paylaşılan bir jeton kullanmayı düşünüyorum ancak Formları kullanmanın ASP.net'den gelmesi en basit çözüm oldu. –

+0

Ah sod! En azından onları aynı alan adına koyabilir misin? Öyleyse, formlar auth çerezi kapsamını ayarlayabilir ve bu şekilde paylaşabilirsiniz. – blowdart

+0

Sanırım, uygulama tek bir kök etki alanı altında bir intranette barındırılacak. Aynı makine anahtarlarını da ayarlayabiliriz ancak kullanıcının web sitesine eriştiğini ve web sitesinin WCF'yi kullanıcının kimliğine bürünen bir veri kaynağı olarak kullandığını unutmayın. Windows Kimlik Doğrulaması ile iyi çalışır, ancak FormsAuthentication çerezini geçmek farklı bir öyküdür. Dariom öneri (veya varsa başka bir şey) deneyeceğim. –