2009-02-18 23 views
23

Temel WCF KullanıcıAdı/Pwd güvenliğini atlatmalı ve varsayılan olarak sağlanandan daha fazla bilgi almak için kendi özel istemci kimlik bilgilerini uygulamam gerekiyordu.WCF Özel İstemci Kimlik Doğrulaması ile Kimlik Doğrulama: Kullanılacak istemciKimliği Türü nedir?

this MSDN article aracılığıyla çalıştım, ancak çalışmadığı için bir şeyi özlüyorum. Ben app çalıştırdığınızda benim özel kimlik ve belirteç yöneticisi oluşturulan alırım, Şimdi

public class CentralAuthCredentials : ClientCredentials 
{ 
    public override System.IdentityModel.Selectors.SecurityTokenManager CreateSecurityTokenManager() 
    { 
     return new CentralAuthTokenManager(this); 
    } 
} 

public class CentralAuthTokenManager : ClientCredentialsSecurityTokenManager 
{ 
    private CentralAuthCredentials credentials; 

    public CentralAuthTokenManager(CentralAuthCredentials creds) : base(creds) 
    { 
     this.credentials = creds; 
    } 

    public override SecurityTokenProvider CreateSecurityTokenProvider(SecurityTokenRequirement tokenRequirement) 
    { 
     if (this.IsIssuedSecurityTokenRequirement(tokenRequirement) || tokenRequirement.TokenType == CentralAuthToken.TOKEN_TYPE) 
      return new CentralAuthTokenProvider(credentials.UserId, credentials.UserPassword, credentials.ImpersonateId, credentials.LoginType); 
     else 
      return base.CreateSecurityTokenProvider(tokenRequirement); 
    } 

    public override SecurityTokenAuthenticator CreateSecurityTokenAuthenticator(SecurityTokenRequirement tokenRequirement, out SecurityTokenResolver outOfBandTokenResolver) 
    { 
     outOfBandTokenResolver = null; 
     if (this.IsIssuedSecurityTokenRequirement(tokenRequirement) || tokenRequirement.TokenType == CentralAuthToken.TOKEN_TYPE) 
      return new CentralAuthTokenAuthenticator(); 
     else 
      return base.CreateSecurityTokenAuthenticator(tokenRequirement, out outOfBandTokenResolver); 
    } 

    public override SecurityTokenSerializer CreateSecurityTokenSerializer(SecurityTokenVersion version) 
    { 
     return new CentralAuthTokenSerializer(); 
    } 
} 

:

Birincisi, özel bir ClientCredentialsSecurityTokenManager sağlamak bazı özel ClientCredentials var. yönteminde Ancak :

CreateSecurityTokenProvider(SecurityTokenRequirement tokenRequirement) 
{ 
    ... 
} 

tokenRequirement.TokenType benim özel belirteci dışındaki bir şey olarak karşısına çıkıyor. Bu benim 1. soru'umu getiriyor: Nasıl WCF belirteç gereksinimlerinin ne olduğunu biliyor mu? Ayrıca

, yöntem:

public override SecurityTokenSerializer CreateSecurityTokenSerializer(SecurityTokenVersion version) 
{ 
    return new CentralAuthTokenSerializer(); 
} 

istemci tarafından bir kez denilen olsun mu, ancak döndürülen simge seri hale getirici yöntemlerin hiçbiri denir. Bu bana, özel jetonun tel üzerinden hiçbir zaman gönderilmediğini gösterir. SecurityTokenRequirement'in özel jetonumun gerektiğini belirtmek için hiçbir zaman geçilmediğinden, bunun nedeni CreateSecurityTokenProvider() öğesine yapılan çağrının hiçbir zaman özel jeton sağlayıcımıma dönmemesidir. İstemci tarafında

ben vardır: Bu yöntemler temelde uç noktadan varsayılan kimlik bilgilerini kaldırmak ve benim özel CentralAuthCredentials yeni bir örneğini eklemek gerekiyor

public class CentralAuthorizationManagerClient : ClientBase<ICentralAuthorizationManager>, ICentralAuthorizationManager, IDisposable 
{ 
    public PFPrincipal GenerateToken() 
    { 
     if (!this.ChannelFactory.Endpoint.Behaviors.Contains(typeof(CentralAuthCredentials))) 
      throw new ArgumentException("Must set CentralAuthCredentials before calling this method."); 
     return base.Channel.GenerateToken(); 
    } 

    public PFPrincipal GenerateToken(CentralAuthToken token) 
    { 
     this.ChannelFactory.Endpoint.Behaviors.Remove<ClientCredentials>(); 
     this.ChannelFactory.Endpoint.Behaviors.Add(new CentralAuthCredentials(token)); 
     return this.GenerateToken(); 
    } 

. (Bu Kaldır/Ekle combo bir MSDN makalesinde bir yere yakaladı). yapılandırmada

: davranışın clientCredentials tip benim özel istemci kimlik olarak ayarlandığını

<behaviors> 
     <endpointBehaviors> 
      <behavior name="Server2ServerEndpointBehavior"> 
       <clientCredentials type="MyApp.Security.CentralAuthCredentials, MyApp"> 
        <clientCertificate findValue="localhost" x509FindType="FindBySubjectName" storeLocation="CurrentUser" storeName="My" /> 
        <serviceCertificate> 
         <authentication certificateValidationMode="None" revocationMode="NoCheck" /> 
        </serviceCertificate> 
       </clientCredentials> 
      </behavior> 
     </endpointBehaviors> 
    </behaviors> 

    <bindings> 
     <wsHttpBinding> 
      <binding name="wsHttpServer2Server"> 
       <security mode="Message"> 
        <message clientCredentialType="UserName" /> 
       </security> 
      </binding> 
     </wsHttpBinding> 
    </bindings> 

Not. Bununla birlikte, şu anda hala bağlayıcı'nın clientCredentialType "UserName" olarak ayarlanmış. Bu benim ikinci soruyu getiriyor: Ne ceck clientCredentialType = "?" Özel kimlik bilgileri kullanıyorum olarak ayarlanmalı mıyım? MSDN göre, Mesaj güvenlik için kullanılabilir değerler şunlardır: Yok, , Windows, KullanıcıAdı, Belgesi ve IssuedToken.

Herhangi bir fikrin var mı? Umarım basit bir şeyi özlüyorum. Tüm uygulama için 6 tane daha sınıf var ama ben sadece durumu anlamak için gereken bitleri dahil etmeye çalıştım ...


GÜNCELLEME # 1: Birkaç kaynaklarına bu bütün gün çalışan ve teşekkür ettik

, ben this page çok son adım oldu ne eksikti o kısmını fark TokenParameters'i bağlamaya ekliyor, böylece ciltleme belirtecin neye benzediğini biliyor. Orijinal 1. soruma cevap budur; "heck belirteç gereksinimlerini nasıl belirler?" Cevap: Bağlanmaya atanan TokenParameters.

public sealed class CentralAuthTokenBindingExtension : BindingElementExtensionElement 
{ 
    public CentralAuthTokenBindingExtension() 
     : base() 
    { 
    } 

    public override Type BindingElementType 
    { 
     get { return typeof(SymmetricSecurityBindingElement); } 
    } 

    protected override System.ServiceModel.Channels.BindingElement CreateBindingElement() 
    { 
     X509SecurityTokenParameters protectionParams = new X509SecurityTokenParameters(); 
     protectionParams.InclusionMode = SecurityTokenInclusionMode.Never; 

     SymmetricSecurityBindingElement innerBindingElement = new SymmetricSecurityBindingElement(); 
     innerBindingElement.EndpointSupportingTokenParameters.SignedEncrypted.Add(new CentralAuthTokenParameters()); 
     //innerBindingElement.MessageProtectionOrder = MessageProtectionOrder.SignBeforeEncrypt; 
     innerBindingElement.ProtectionTokenParameters = protectionParams; 

     return innerBindingElement; 
    } 
} 

    <extensions> 
     <bindingElementExtensions> 
      <add name="CentralAuthCreds" type="MyApp.Security.Configuration.CentralAuthTokenBindingExtension, MyApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
     </bindingElementExtensions> 
    </extensions> 

    <bindings> 
     <customBinding> 
      <binding name="wsHttpServer2Server"> 
       <CentralAuthCreds /> 
       <binaryMessageEncoding /> 
       <httpTransport /> 
      </binding> 
     </customBinding> 
    </bindings> 

Kuyusu bir adım daha beni alır:

yüzden şimdi bağlayıcı üzerinde TokenParameters ayarlar aşağıdaki uzantıyı ekledi. Şimdi sunucuda yeni bir durum almak: Bu WCF gibi görünüyor

"The security token manager cannot create a token authenticator for requirement ..." 

yerine benim özel simge işleyici, benim özel belirteci başa denemek için bazı varsayılan jeton yöneticisini kullanıyor (benim özel belirteç eylemcinin yapıcı asla olarak adlandırılır).

<endpointBehaviors> 
    <behavior name="Server2ServerEndpointBehavior"> 
     <clientCredentials type="MyApp.Security.CentralAuthCredentials, MyApp"> 

Ama sunucusunda üzerinde

Ben özel istemci kimlik hakkında bilgi vermek için herhangi bir eşdeğer yok: Bunu istemci için çünkü oluyor düşünüyorum , bu yapılandırma var. Bu nedenle, yeni soru: Sunucu için yapılandırmada özel ClientCredentials'ın ne olduğunu anlatabilir miyim?


Güncelleme # 2:

Eh, nihayet bulmacanın biraz daha anladım. İstemcinin kredileri gönderdiklerini düşünerek yalnızca bir ClientCredentials uygulaması uygulamıştım. İstemci hizmeti doğrulamıyor, bu yüzden özel ServiceCredentials'a ihtiyacım yok. Şey, yanılmışım. Belirtilen ServiceCredentials, belirteci ClientCredentials'dan doğrular ve bunun tersi de geçerlidir. Bu yüzden, aynı TokenSerializer ve TokenAuthenticator sınıflarını geçen özel bir ServiceCredentials uygulaması eklemem gerekiyordu.

Bir sonraki sayıya gelindiğinde: WCF artık, UserName auth ile düzgün çalışan yapılandırmada belirtilen x509 sertifikalarımı görmezden geliyor. Bunun için tamamen yeni bir soru açacağım!

+0

Tamam, bu soru neredeyse benimki gibi iki gün! – basscinner

cevap

1

Çalıştığım bir uygulama ile benzer sorunlara girdim, maalesef çalışmama özel kimlik bilgilerini alamadığım için pes ettim. Kullanıcı adı/parola (istemci kimlik bilgileri) ve sertifika (servis kimlik bilgileri) kullanarak, servis bilgisine ek olarak, örneğin UserID gibi ek bilgileri geçmek için servis çağrılarına eklendim.

İlgili konular