Como recebo o X509Certificate enviado do cliente no serviço da web?

Aparentemente, eu estava fazendo a pergunta errada no meu post anterior. Eu tenho um serviço da Web protegido com um certificado X.509, funcionando como um site seguro https: //..). Desejo usar o certificado de máquina do cliente (também X.509) emitido pela autoridade de certificação raiz da empresa para verificar no servidor se a máquina cliente está autorizada a usar o serviço. Para fazer isso, preciso inspecionar o certificado e procurar algum recurso de identificação e associá-lo a um valor armazenado em um banco de dados (talvez a Impressão digital?

Aqui está o código que eu uso para obter o certificado no armazenamento de certificados local (retirado diretamente dehttp: //msdn.microsoft.com/en-us/magazine/cc163454.asp):

 public static class SecurityCertificate
{
    private static X509Certificate2 _certificate = null;

    public static X509Certificate2 Certificate
    {
        get { return _certificate; }
    }

    public static bool LoadCertificate()
    {
        // get thumbprint from app.config
        string thumbPrint = Properties.Settings.Default.Thumbprint;
        if ( string.IsNullOrEmpty( thumbPrint ) )
        {
            // if no thumbprint on file, user must select certificate to use
            _certificate = PickCertificate( StoreLocation.LocalMachine, StoreName.My );
            if ( null != _certificate )
            {
                // show certificate details dialog
                X509Certificate2UI.DisplayCertificate( _certificate );
                Properties.Settings.Default.Thumbprint = _certificate.Thumbprint;
                Properties.Settings.Default.Save();
            }
        }
        else
        {
            _certificate = FindCertificate( StoreLocation.LocalMachine, StoreName.My, X509FindType.FindByThumbprint, thumbPrint );
        }

        if ( null == _certificate )
        {
            MessageBox.Show( "You must have a valid machine certificate to use STS." );
            return false;
        }

        return true;
    }

    private static X509Certificate2 PickCertificate( StoreLocation location, StoreName name )
    {
        X509Store store = new X509Store( name, location );
        try
        {
            // create and open store for read-only access
            store.Open( OpenFlags.ReadOnly );

            X509Certificate2Collection coll = store.Certificates.Find( X509FindType.FindByIssuerName, STSClientConstants.NBCCA, true );
            if ( 0 == coll.Count )
            {
                MessageBox.Show( "No valid machine certificate found - please contact tech support." );
                return null;
            }

            // pick a certificate from the store
            coll = null;
            while ( null == coll || 0 == coll.Count )
            {
                coll = X509Certificate2UI.SelectFromCollection(
                        store.Certificates, "Local Machine Certificates",
                        "Select one", X509SelectionFlag.SingleSelection );
            }

            // return first certificate found
            return coll[ 0 ];
        }
        // always close the store
        finally { store.Close(); }
    }

    private static X509Certificate2 FindCertificate( StoreLocation location, StoreName name, X509FindType findType, string findValue )
    {
        X509Store store = new X509Store( name, location );
        try
        {
            // create and open store for read-only access
            store.Open( OpenFlags.ReadOnly );

            // search store
            X509Certificate2Collection col = store.Certificates.Find( findType, findValue, true );

            // return first certificate found
            return col[ 0 ];
        }
        // always close the store
        finally { store.Close(); }
    }

Em seguida, anexo o certificado ao fluxo de saída da seguinte forma:

public static class ServiceDataAccess
{    
    private static STSWebService _stsWebService = new STSWebService();

    public static DataSet GetData(Dictionary<string,string> DictParam, string action)
    {
        // add the machine certificate here, the first web service call made by the program (only called once)
        _stsWebService.ClientCertificates.Add( SecurityCertificate.Certificate );
        // rest of web service call here...
    }
}

Minha pergunta é esta - como "obtenho" o certificado no código de serviço da web? A maioria dos trechos de código de exemplo que eu encontrei abordam como fazer a validação personalizada com uma chamada GetCertificate (), aparentemente assumindo que parte é tão fácil que todos devem saber como fazê-lo?

Minha classe principal herda de WebService, para que eu possa usar Context.Request.ClientCertificate para obter um certificado, mas esse é um HttpClientCertificate, não um X509Certificate2. HttpContext me dá o mesmo resultado. Outras abordagens usam código de configuração da web para chamar código de verificação predefinido, sem nenhuma pista de como chamar um método C # personalizado para fazer a verificaçã

questionAnswers(6)

yourAnswerToTheQuestion