Аутентификация службы данных WCF - PullRequest
4 голосов
/ 06 апреля 2011

-Можно ли защитить службу данных WCF с помощью аутентификации на основе сертификатов?

-Есть ли ресурс, который описывает этот процесс?

-Можно ли использовать безопасность сообщений с помощьюСлужба данных WCF?

Ответы [ 2 ]

3 голосов
/ 06 апреля 2011

Ответ на все ваши вопросы «да».Ниже приведена очень информативная ссылка, предоставленная командой «Шаблоны и практики» в Microsoft, чтобы выполнить именно то, что вы ищете.

http://msdn.microsoft.com/en-us/library/cc949005.aspx

2 голосов
/ 11 ноября 2013

Аутентификация на основе сертификатов может быть выполнена следующим образом:

На стороне сервера:

public class ODataService : DataService<Database>
    {
        public ODataService()
        {
            ProcessingPipeline.ProcessingRequest += ProcessingPipeline_ProcessingRequest;
        }

        void ProcessingPipeline_ProcessingRequest(object sender, DataServiceProcessingPipelineEventArgs e)
        {
            if (!HttpContext.Current.Request.ClientCertificate.IsPresent)
            {
                throw new DataServiceException(401, "401 Unauthorized");
            }

            var cert = new X509Certificate2(HttpContext.Current.Request.ClientCertificate.Certificate);
            if (!ValidateCertificate(cert))
            {
                throw new DataServiceException(401, "401 Unauthorized");
            }

            var identity = new GenericIdentity(cert.Subject, "ClientCertificate");
            var principal = new GenericPrincipal(identity, null);
            Thread.CurrentPrincipal = principal;
            HttpContext.Current.User = principal;
        }

        private bool ValidateCertificate(X509Certificate2 cert)
        {
            // do some validation
        }

На стороне клиента:

Создайте частичный класс для ссылки на службу базы данных (DataServiceContext))

public partial class Database
{
    // ref: http://social.msdn.microsoft.com/Forums/en-US/0aa2a875-fd59-4f3e-a459-9f604b374749/how-do-i-use-certificate-based-authentication-with-data-services-client?forum=adodotnetdataservices
    private X509Certificate clientCertificate = null;
    public X509Certificate ClientCertificate
    {
        get
        {
            return clientCertificate;
        }
        set
        {
            if (value == null)
            {
                // if the event has been hooked up before, we should remove it
                if (clientCertificate != null)
                {
                    SendingRequest -= OnSendingRequest_AddCertificate;
                }
            }
            else
            {
                // hook up the event if its being set to something non-null
                if (clientCertificate == null)
                {
                   SendingRequest += OnSendingRequest_AddCertificate;
                }
            }

            clientCertificate = value;
        }
    }

    private void OnSendingRequest_AddCertificate(object sender, SendingRequestEventArgs args)
    {
        if (null != ClientCertificate)
        {
            (args.Request as HttpWebRequest).ClientCertificates.Add(ClientCertificate);
        }
    }

Используйте его следующим образом

        Database db = new Database(new Uri(service));
        db.ClientCertificate = CertificateUtil.GetCertificateByThumbprint(StoreName.My,
                                                                          StoreLocation.LocalMachine,
                                                                          "<a thumbprint>");

Закрытый ключ хранится на клиентском компьютере, открытый ключ хранится на сервере на локальном компьютере / Trusted Root CA

Не забудьтетребовать / согласовывать сертификат клиента для этого сайта в IIS.

(протестировано на WCF Data Services 5.2, VS 2012)

...