2010-09-15 27 views
16

Özel WCF kimlik doğrulaması ve yetkilendirme üzerinde çalışıyorum ve KullanıcıAdıPasswordValidator ve ServiceAuthorizationManager ile ilgili bazı makaleler buldum.System.ServiceModel.ServiceAuthenticationManager ile özel WCF kimlik doğrulaması?

Özel bir System.ServiceModel kullanma hakkında ipuçları da buldum. ServiceAuthenticationManager (dead link), ancak msdn bu konuda çok şey söylemiyor (http://msdn.microsoft.com/en-us/library/system.servicemodel.serviceauthenticationmanager.aspx).

Yani işte buradayım: Herkes ServiceAuthenticationManager hakkında daha fazla şey biliyor mu?

Genel olarak, özel WCF kimlik doğrulamasını nasıl kurarsınız?

+4

Bu garip, ama yine de ServiceAuthorizationManager için bilgi ve örneklerin bir sürü var orada görünüyor, ama ServiceAuthenticationManager – Cocowalla

cevap

35

Haklısınız, bununla ilgili belgelerin hiç bir faydası yok.

Bu sınıfı kullandığım yol aşağıdaki gibidir.

  1. belirteçleri için kimlik doğrulaması
  2. gelen mesaj üzerinden kimlik doğrulama bilgilerini (örneğin, kullanıcı adı/şifre) çekerek ve IPrincipal nesne oluşturmak için kullanılmaktadır: kimlik doğrulaması() metodu için geçersiz kılar. Bu, servis işleminin başlatılması sırasında kullanılan müdür olacaktır. Bunu sadece bu noktada iplik ilkesini ayarlayamıyor

WCF işleme boru hattında daha sonra kullanılabilir böylece WCF tarafından sonradan değiştirilir olarak

  • message.Properties koleksiyonuna IPrincipal nesnesi ekleyin . kullanılarak

    public override ReadOnlyCollection<IAuthorizationPolicy> Authenticate(ReadOnlyCollection<IAuthorizationPolicy> authPolicy, Uri listenUri, ref Message message) 
    { 
        int tokenPosition = message.Headers.FindHeader("Token", "http://customnamespace.org"); 
        string token = message.Headers.GetHeader<string>(tokenPosition); 
    
        IPrincipal user = new CustomPrincipal(token); 
    
        message.Properties["Principal"] = user; 
    
        return authPolicy; 
    } 
    

    Sonra

    1. mesajdan IPrincipal alır o özel yetkilendirme politikası eklemek (:

      ServiceAuthenticationManager.Authenticate kod() yöntemleri şöyle görünecektir System.ServiceModel.EvaluationContext.Current.IncomingMessageProperties koleksiyonu).

    2. IAuthorizationPolicy kod() metodu gibi olacaktır
    3. IPrincipal.IsInRole göre iddia etmek EvaluationContext.Properties toplama() metodu

    içine IPrincipal iter

    public bool Evaluate(EvaluationContext evaluationContext, ref object state) 
    { 
        IPrincipal user = OperationContext.Current.IncomingMessageProperties["Principal"] as IPrincipal; 
        evaluationContext.Properties["Principal"] = user; 
        evaluationContext.Properties["Identities"] = new List<IIdentity> { user.Identity }; 
    
        IList<Claim> roleClaims = this.GetRoleClaims(user); 
    
        evaluationContext.AddClaimSet(this, new DefaultClaimSet(this.Issuer, roleClaims)); 
    
        return true; 
    } 
    

    Hizmet davranışı yapılandırmasında, WCF'nin IPrincipal'i asıl hizmet işlemi çağrısı için yürütme iş parçacığı üzerinde asıl olarak ayarlaması için principalPermissionMode = "Özel" değerini ayarlamanız gerekir.

    <serviceAuthorization principalPermissionMode="Custom"... 
    
  • +1

    teşekkür için pek bir şey, gerçekten çok yardımcı oldu. Alkışlar :-) – fredlegrain

    +0

    ServiceAuthenticationManager'da ClaimSet'e bir kimlik talebi eklenmesi mümkün mü?Principal'i Properties'e koymak yerine Authenticate()? –

    +1

    Bu mümkündür. Düşündüğüm amaç, AuthenticationManager'ın kimlik bilgilerini doğrulaması ve doğrudan kimlik sağlayıcısından gelen taleplerle (bir kimlik iddiası bunlardan biri olacaktır), AuthorizationPolicy istemleri dönüştürmesi ve AuthorizationManager'ın yetkilendirme kararını vermesidir. Bununla ilgili belgelerin kıt olmasına rağmen anlatması zor. Her neyse, şimdi WIF mevcut model daha basit: o) –

    İlgili konular