2010-11-09 23 views
8

Ayrı bir WCF STS Hizmeti tarafından verilen bir güvenlik belirteci gerektiren bir WCF Hizmetim var. Her şey yolunda gidiyor. Benim uygulamada, ben şöyle servisini kullanmak: STS Hizmet jetonu almak üzere denir ve belirteci hizmeti yöntemi DoStuff çağırmak için kullanılanWCF hizmeti için güvenlik belirtecini yenilemeyi nasıl zorlayabilirim?

MyServiceClient myService = new MyServiceClient(); 
myService.Open(); 
myService.DoStuff(); 

.

ilk el sıkışma bittikten sonra, yine de, myService nesne belirteci önbelleğe sahiptir ve sona kadar yeniden kullanır. Bu iyi bir davranış ve her şeydir, ancak kodunu nasıl yenileyecek? I() DoStuff denilen eğer tekrar bilemez

myService.ClientCredentials.Invalidate(); // something like this? 

Böyle tekrar kadara ilk kez yaptığı gibi STS gitmek gerekir.

Sadece yani myService = new MyServiceClient();, yeni vekil sınıf nesnesi yapma sıkışmış muyum? Bu işe yarıyor ama nükleer bomba çözümü gibi görünüyor. Alternatif

, sadece elle mevcut olanı yeni jetonu almak ve değiştirmek için bir yol, yani myService.ClientCredentials.Renew(); var mı?

Bunu yapmak için özel bir ClientCredentials sınıf yapmak varsa, nasıl Yukarıdaki örnek yöntemlerini uygulamak?

cevap

4

Kod tablomuzda, belirtiyi önbelleğe alıyoruz, bu yüzden STS'ye tekrarlanan arama yapmadığımızdan emin oluyoruz. Aynı yöntemi kullanarak, dilediğiniz zaman manuel olarak başka bir jeton isteyebilirsiniz. İşte ClientCredentials içine kanca için: STS çağrılan nerede

public class CustomClientCredentials : ClientCredentials 
{ 
    public CustomClientCredentials() 
    { 
    } 

    protected CustomClientCredentials(ClientCredentials other) 
     : base(other) 
    { 
    } 

    protected override ClientCredentials CloneCore() 
    { 
     return new CustomClientCredentials(this); 
    } 

    /// <summary> 
    /// Returns a custom security token manager 
    /// </summary> 
    /// <returns></returns> 
    public override SecurityTokenManager CreateSecurityTokenManager() 
    { 
     return new CustomClientCredentialsSecurityTokenManager(this); 
    } 
} 


public class CustomClientCredentialsSecurityTokenManager : ClientCredentialsSecurityTokenManager 
{ 
    public CustomClientCredentialsSecurityTokenManager(ClientCredentials credentials) 
     : base(credentials) 
    { 
    } 

    /// <summary> 
    /// Returns a custom token provider when a issued token is required 
    /// </summary> 
    public override SecurityTokenProvider CreateSecurityTokenProvider(SecurityTokenRequirement tokenRequirement) 
    { 
     if (IsIssuedSecurityTokenRequirement(tokenRequirement)) 
     { 
      // Adds the endpoint behaviors for calling the issuer 
      IssuedSecurityTokenProvider baseProvider = (IssuedSecurityTokenProvider)base.CreateSecurityTokenProvider(tokenRequirement); 

      CustomIssuedSecurityTokenProvider provider = new CustomIssuedSecurityTokenProvider(baseProvider); 
      return provider; 
     } 
     return base.CreateSecurityTokenProvider(tokenRequirement); 
    } 
} 


public class CustomIssuedSecurityTokenProvider : IssuedSecurityTokenProvider 
{ 
    private readonly IssuedSecurityTokenProvider _innerProvider; 

    public CustomIssuedSecurityTokenProvider(IssuedSecurityTokenProvider innerProvider) 
    { 
     _innerProvider = innerProvider; 
     CacheIssuedTokens = innerProvider.CacheIssuedTokens; 
     IdentityVerifier = innerProvider.IdentityVerifier; 
     IssuedTokenRenewalThresholdPercentage = innerProvider.IssuedTokenRenewalThresholdPercentage; 
     IssuerAddress = innerProvider.IssuerAddress; 
     IssuerBinding = innerProvider.IssuerBinding; 
     innerProvider.IssuerChannelBehaviors.ForEach(IssuerChannelBehaviors.Add); 
     KeyEntropyMode = innerProvider.KeyEntropyMode; 
     MaxIssuedTokenCachingTime = innerProvider.MaxIssuedTokenCachingTime; 
     MessageSecurityVersion = innerProvider.MessageSecurityVersion; 
     SecurityAlgorithmSuite = innerProvider.SecurityAlgorithmSuite; 
     SecurityTokenSerializer = innerProvider.SecurityTokenSerializer; 
     TargetAddress = innerProvider.TargetAddress; 
     innerProvider.TokenRequestParameters.ForEach(TokenRequestParameters.Add); 

     _innerProvider.Open(); 
    } 

    ~CustomIssuedSecurityTokenProvider() 
    { 
     _innerProvider.Close(); 
    } 

    protected override SecurityToken GetTokenCore(TimeSpan timeout) 
    { 
     // We're ignoring the CacheIssuedTokens property in order to force an STS call 
     var securityToken = _innerProvider.GetToken(timeout); 
     return securityToken; 
    } 
} 

GetTokenCore() yöntemidir. GetToken() 'i çağırdığınızda, STS'den başka bir belirteç çıkarması istenecektir.

Sorunuzdan, app.config dosyasından ClientCredentials'a nasıl bağlanacağınızı bildiğinizi farz ediyorum.

App.config dosyasında CacheIssuedTokens özelliğini ayarlamanın bir yolu olabilir, sadece kafamın üstünden bir yol emin değilim.

1

IssuedToken.MaxIssuedTokenCachingTime özelliğini kullanıp 0 değerine ayarlanamaz mısınız?

İlgili konular