Я использую пользовательскую привязку в файле 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, выдается исключение или что-то в этом роде.