клиентские сертификаты принимают PrimaryIdentity - PullRequest
0 голосов
/ 05 июня 2011

Я использую несколько типов сервисов wcf,
один из них подписан.
обычно я получаю имя пользователя клиента из:

ServiceSecurityContext.PrimaryIdentity.Name

теперь, когда он получил подписанный сервис, основным удостоверением становится сертификат X509.
Идентификатор Windows является анонимным или что-то в этом роде.

какой правильный способ отправить оба,сертификат и обычное удостоверение личности.
или, как получить имя пользователя ..?

спасибо вам всем.

Ответы [ 3 ]

2 голосов
/ 05 июня 2011

Это означает, что ваш сервис использует настройки безопасности с clientCredentialsType="Certificate". Этот сертификат используется для идентификации ваших клиентов. Если вы хотите использовать UserName или Windows аутентификацию, почему вы используете сертификат? Сообщение будет подписано всегда, если вы используете безопасную конфигурацию (безопасность транспорта или сообщения).

Можно передать как сертификат, так и имя пользователя, но для этого требуется полное пользовательское связывание, разработанное в коде, где имя пользователя будет передаваться в качестве вспомогательного токена. Я не уверен, поддерживает ли WCF этот уровень, чтобы заполнить для вас PrimaryIdentity из вспомогательного токена.

1 голос
/ 12 августа 2011

Я использую пользовательскую привязку в файле web.config для выполнения сертификата X509 и токена имени пользователя WSS.Вам не нужно разрабатывать пользовательские привязки в коде.Это можно сделать в конфигурационном файле.Возможно, вы захотите использовать оба сертификата и токен имени пользователя, потому что у вас может быть нечто (например, Datapower, Biztalk, что угодно) между вашим клиентом и вашим сервисом.И вам нужно аутентифицировать как клиента, так и штуку посередине.

Вот моя привязка ...

<customBinding>
                <binding name="MySvcBindingConfiguration">
                    <security authenticationMode="UserNameOverTransport" includeTimestamp="false" requireDerivedKeys="false" securityHeaderLayout="Lax" messageProtectionOrder="SignBeforeEncrypt" messageSecurityVersion="WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10">
                        <localClientSettings maxClockSkew="00:30:00" />
                        <localServiceSettings maxClockSkew="00:30:00" />
                        <secureConversationBootstrap />
                    </security>
                    <textMessageEncoding messageVersion="Soap11">
                        <readerQuotas maxDepth="32" maxStringContentLength="524288" maxArrayLength="524288" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    </textMessageEncoding>
                    <httpsTransport requireClientCertificate="true" />
                </binding>
            </customBinding>

Пожалуйста, обратитесь к моему ответу вопрос относительно PrimaryIdentity.Name.Вы можете полностью настроить ServiceSecurityContext.Current.PrimaryIdentity с помощью пользовательского AuthorizationPolicy.

В функции Evaluate вашего AuthorizationPolicy вы увидите несколько идентификаторов в контексте оценки.Вы можете заменить их своей собственной индивидуальной идентификацией, а затем WCF поместит эту идентификационную информацию в ServiceSecurityContext.Current.PrimaryIdentity.Пожалуйста, убедитесь, что в списке есть только одна личность, когда вы вернете ее обратно в analysisContext.Кроме того, если вам требуется SSL и клиентские сертификаты на веб-сайте IIS или в VDir, то он будет отображаться как X509Identity в файлеvaluationContext.

var myCertIdId = identities.Find(x => x.AuthenticationType == "X509");

            var myCertThumbprint = myCertIdId != null
                                     ? myCertIdId.Name.Substring(myCertIdId.Name.LastIndexOf(';') + 2)
                                     : "";

            var store = new X509Store(StoreName.TrustedPeople, StoreLocation.LocalMachine);

            store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);

            var certCol =
                store.Certificates.Find(X509FindType.FindByThumbprint, myCertThumbprint, false);

            store.Close();

var myCert = certCol[0];

myCert - это сертификат из хранилища сертификатов ... вы можете захотетьчтобы проверить счетчик в коллекции и, если счетчик равен 0, выдается исключение или что-то в этом роде.

1 голос
/ 06 июня 2011

Если у вас есть клиентские сертификаты, сопоставленные в AD, вы можете получить их, установив

system.webServer / security / authentication / clientCertificateMappingAuthentication для свойства True.

Это будет работать только в IIS 7.x. я не знаю эквивалентные настройки в IIS 6. но я предполагаю, что есть некоторые настройки для сопоставления сертификатов клиентов AD.

НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...