2009-07-18 39 views
5

Bir Silverlight v3 web uygulaması üzerinde çalışıyorum ve benim veri getirmek için kullanıyorum WCF servisine erişim sağlamak istiyoruz. Şu anda WCF'nin iyi çalıştığını biliyorum, ancak herhangi bir kullanıcı bilgisi gerektirmiyor.WCF + Kullanıcı kimlik bilgileri

benim ilk fikir benim hizmetin operasyonlarının her birine adı ve şifre parametreleri eklemek için bu yüzden çok, WCF bu yönü ile deneyimli değilim. Bununla ilgili sorun, bunun bir çok gereksiz kod gerektirmesi ve kullanıcı adı ile şifrenin düz metin içinde tel üzerinden aktarılması gerektiğidir.

Ne istiyorum ("Hizmet başvurusu Ekle" Ben den otomatik olarak oluşturulan vekil kullanıyorum) benim hizmet proxy oluşturmak hemen sonra istemci tarafında açık kimlik bilgilerini belirtmek için bir yoldur. Buna bir çözüm için googling üzerine

, sadece (kullanıcı adı/şifre parametreleri kullanılarak) ilk fikrine benzer çözümler bulabiliriz. Birisi beni doğru yöne yönlendirebilir mi?

Teşekkürler!

cevap

7

Nerede bu kullanıcı adları ve şifreler geliyor? Web siteniz Formlar kimlik doğrulamasını zaten uyguladıysa, kimlik bilgilerini kendiniz ayarlayarak ve form kimlik doğrulama çerezini kullanabilirsiniz.Kullanıcılarınız giriş yaptıysa, çerez web servis çağrısı ile seyahat eder. Diğer tarafta okumak için birkaç değişiklik yapmalısınız. her hizmet yöntemi için daha sonra tamamlandığında, ASP.NET çerez eklemek anlamak istiyorum

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

:

Önce System.ServiceModel bölümünde WCF için ASP.NET uyumluluk modunu etkinleştirmeniz gerekir [AspNetCompatibilityRequirements] kullanıcının kimliğini bulmak için HttpContext.Current.User.Identity nesneye erişebilen her yöntem dahilinde Artık, hizmet sınıfının

[ServiceContract] 
[AspNetCompatibilityRequirements(
    RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class ExampleService 
{ 
} 

için bağlıyor.

yalnızca belirli yöntemler istiyorsanız

Eğer ASP.NET rolü sağlayıcı sonra bu da doldurulur kullanıyorsanız o zaman bir avantaj olarak bir PrincipalPermission böylece

[OperationContract] 
[PrincipalPermission(SecurityAction.Demand, Authenticated=true)] 
public string Echo() 

kullanabilirsiniz doğrulanmış kullanıcılar tarafından çağrılacak ve Eğer daha sonra belirli bir rolün üyelerine onları sınırlamak için yöntemler üzerinde bir PrincipalPermission kullanabilirsiniz:

[OperationContract] 
[PrincipalPermission(SecurityAction.Demand, Role="Administators")] 
public string NukeTheSiteFromOrbit() 

Ve bu yanı besbelli Silverlight2 çalışır.

+0

Güzel görünüyor; Eğer ham (httpwebrequest) kullanıyorsanız bu (veya benzer bir şey) kullanılabilir olup olmadığını biliyor musunuz? Aynı şekilde güvenli olmasını istediğim özel bir RPC yığını var (tabii ki önemsiz bir cevapsa yeni bir queston olarak sorabilirim) –

+0

Evet; bkz http://www.silverlightshow.net/items/Cookies-in-Silverlight-Web-Requests.aspx – blowdart

+0

Ta; Şuna bakacağım; -p –

0

kimlik doğrulama nesne çeşit geçmek ve WCF ile mesaj seviyede şifreleyebilirsiniz. Ardından gereksiz mantığı önlemek için C# yönleri (http://www.postsharp.org/) kullanılabilir. Onu işlemenin çok temiz bir yolu.

1

rulo kendi ve açık parametreleri eklemek etmeyin - o gerçekten çok fazla işim!

WCF güvenlik özelliklerine bakın - bunlardan bolca! Ör. Mesajın güvenliğini sağlayın ve mesajın içindeki kimlik bilgilerini girin - kutunun dışında, yanınızda ekstra kodlama gerekmez!

Kontrol dışarı bu mükemmel Michele Leroux Bustamante tarafından WCF güvenlik konusunda madde: Senin durumunda http://www.devx.com/codemag/Article/33342

, ben kullanıcı adı kimlik bilgileriyle mesaj güvenliğini öneririm - Eğer her iki ucunda bu yapılandırmanız gerekir:

Sunucu tarafı: istemci tarafında aynı ayarları uygulamak gerekir

<bindings> 
    <basicHttpBinding> 
    <binding name="SecuredBasicHttp" > 
     <security mode="Message"> 
     <message clientCredentialType="UserName"/> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<services> 
    <service name="YourService"> 
    <endpoint address="http://localhost:8000/MyService" 
       binding="basicHttpBinding" 
       bindingConfiguration="SecuredBasicHttp" 
       contract="IYourService" /> 
    </service> 
</services> 

Ve:

<bindings> 
    <basicHttpBinding> 
    <binding name="SecuredBasicHttp" > 
     <security mode="Message"> 
     <message clientCredentialType="UserName"/> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<client> 
    <endpoint address="http://localhost:8000/MyService" 
       binding="basicHttpBinding" 
       bindingConfiguration="SecuredBasicHttp" 
       contract="IYourService" /> 
</client> 

Şimdi sunucu ve istemci güvenliği üzerinde anlaşmaya - istemci üzerinde, daha sonra böyle kullanmak kullanıcı adı ve şifresini belirtmek istiyorum:

Sunucu tarafında
YourServiceClient client = new YourServiceClient(); 

client.ClientCredentials.UserName.UserName = "your user name"; 
client.ClientCredentials.UserName.Password = "top$secret"; 

, bunları gerekir Bu kullanıcı kimlik bilgilerinin nasıl doğrulandığını ayarlamak için - genellikle bir Windows etki alanına (Active Directory) veya ASP.NET üyelik sağlayıcısı modeline karşı. Her durumda, kullanıcı kimlik bilgileri tanımladığınız mağazayla doğrulanamıyorsa, çağrı reddedilir.

Bu biraz yardımcı olur umarım - güvenlik WCF'de büyük bir konudur ve çok sayıda seçeneğe sahiptir - bu biraz göz korkutucu olabilir, ama sonuçta genellikle mantıklıdır! :-)

Marc

+6

Bunu yapabildiğiniz senaryodan emin değilim, ancak deneyimlerimde WCF'ye izin verilmiyor. Message-mode kullanıcı adı-kimlik bilgisi güvenliğini basicHttpBinding'de kullanamazsınız, çünkü bu bilgiler çerçevenin düz metin olarak iletileceğinden çerçeve tarafından izin verilmez. Bu InvalidOperationException'ı alırsınız: "BasicHttp bağlaması, BasicHttpBinding.Security.Message.ClientCredentialType'ın güvenli iletiler için BasicHttpMessageCredentialType.Certificate kimlik türüne eşdeğer olmasını gerektirir. UserName kimlik bilgileri için Aktarım veya AktarımWithMessageCredential güvenliği'ni seçin." – Grank

İlgili konular