Предотвращение WCF в IIS7 от кэширования сертификатов аутентификации - PullRequest
1 голос
/ 10 августа 2011

Я создаю приложение на основе WCF, пользователи которого проходят аутентификацию с использованием сертификатов на смарт-картах.Служба размещена на IIS7, а клиенты являются приложениями Windows Form.

Проблема заключается в том, что при добавлении нового пользователя (создании нового сертификата) этот пользователь не может войти в систему, пока 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>

Есть ли способ предотвратить "кэширование" этого сертификатаиметь место или обновить список активных сертификатов по требованию?

1 Ответ

0 голосов
/ 25 августа 2011

Очевидно, что кэширование было известной "особенностью" System.Identitymodel.Обсуждается здесь и более подробная информация доступна здесь .

Что я сделал, так это использовал пользовательский валидатор (код ниже), который позаботился о проблеме.

EDIT : добавлено больше кода для проверки сертификатов X.509 по CRL в режиме реального времени здесь

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);
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...