2011-08-10 18 views
1

スマートカードの証明書を使用してユーザーを認証してWCFベースのアプリケーションを構築しています。このサービスはIIS7上でホストされ、クライアントはWindowsフォームアプリケーションです。IIS7でWCFが認証証明書をキャッシュするのを防ぐ

問題は、新しいユーザーが追加されたとき(新しい証明書が作成されたとき)、IISが再起動されるか、アプリケーションプールがリサイクルされるまでユーザーがログインできないということです。既存のユーザーが削除された場合、再起動/リサイクルまでログオンすることもできます。私は

 <serviceCredentials> 
      <serviceCertificate findValue="blahblah.local" 
    x509FindType="FindBySubjectName" storeLocation="LocalMachine" storeName="My" /> 
      <userNameAuthentication userNamePasswordValidationMode="MembershipProvider" 
    membershipProviderName="SqlMembershipProvider" cacheLogonTokens="true"/> 
      <clientCertificate> 
       <authentication mapClientCertificateToWindowsAccount="true" 
certificateValidationMode="ChainTrust" revocationMode="Online"/> 
      </clientCertificate> 
     </serviceCredentials> 

を持って私の行動の定義で

起こってからこの証明書「キャッシュ」を防止またはオンデマンドでアクティブな証明書のリストを更新する方法はありますか?

+0

新しい方法を追加しますリアルタイムでCRLのに対して、X.509証明書を検証するためのより多くのコードを追加しました証明書/クライアント? –

答えて

0

明らかに、キャッシングはSystem.IdentityModelの既知の「機能」でした。それはhereとより多くの情報が利用可能なhereを議論した。

私がしたことは、この問題を処理したカスタムバリデーター(下のコード)を使用することでした。

EDITは:here

web.configファイル

<clientCertificate> 
    <authentication mapClientCertificateToWindowsAccount="true" certificateValidationMode="Custom" customCertificateValidatorType="My.IdentityModel.MyX509Validator, My.IdentityModel" /> 
</clientCertificate> 

コード

using System; 
using System.IO; 
using System.IdentityModel.Selectors; 
using System.IdentityModel.Tokens; 
using System.Security.Cryptography; 
using System.Security.Cryptography.X509Certificates; 

namespace My.IdentityModel 
{ 
    /// <summary> 
    /// Custom X.509 certificate validator 
    /// Richard Ginzburg - richard (at) ginzburgconsulting (dot) com 
    /// </summary> 
    public class MyX509Validator : X509CertificateValidator 
    { 
     public override void Validate(X509Certificate2 certificate) 
     { 
      if (certificate == null) 
      { 
       throw new ArgumentNullException("certificate", "Certificate validation failed, no certificate provided"); 
      } 

      X509ChainPolicy myChainPolicy = new X509ChainPolicy 
               { 
                RevocationMode = X509RevocationMode.Online, 
                RevocationFlag = X509RevocationFlag.EntireChain, 
                VerificationFlags = X509VerificationFlags.NoFlag, 
                UrlRetrievalTimeout = new TimeSpan(0, 0, 10), 
                VerificationTime = DateTime.Now 
               }; 
      X509Chain chain = new X509Chain(true) {ChainPolicy = myChainPolicy}; 

      try 
      { 
       bool ok = chain.Build(certificate); 
       if(!ok) 
       { 
        foreach (var status in chain.ChainStatus) 
        { 
         Logging.Log("MyX509Validator: Validation failed - " + status.StatusInformation); 
        } 
        throw new SecurityTokenValidationException("Certificate validation failed when building chain"); 
       } 
      } 
      catch (CryptographicException e) 
      { 
       throw new SecurityTokenValidationException("Certificate validation failed when building chain, " + e); 
      } 
     } 
    } 
} 
関連する問題