Пользовательский поставщик маркеров
Этот образец демонстрирует, как реализовать пользовательский поставщик маркеров, выдаваемых клиенту.
Обсуждение
Поставщик маркеров в среде Windows Communication Foundation (WCF) используется для передачи учетных данных в инфраструктуру безопасности. Поставщик маркеров осуществляет общую проверку целевой точки и выдает соответствующие учетные данные, чтобы инфраструктура безопасности могла защитить сообщение. Среда WCF содержит поставщик маркеров CardSpace. Пользовательские поставщики маркеров полезны в следующих случаях:
если используется хранилище учетных данных с которым не работает встроенный поставщик маркеров;
если требуется создать собственный пользовательский механизм для преобразования учетных данных из точки, где пользователь предоставляет сведения, в точку WCF, где клиент использует учетные данные;
если строится пользовательский маркер.
Этот образец показывает, как построить пользовательский поставщик маркеров, который кэширует маркеры, выданные службой маркеров безопасности (STS).
Итак, этот образец демонстрирует следующее:
как настроить клиент с пользовательским поставщиком маркеров;
как можно кэшировать выданные маркеры и предоставить их клиенту WCF;
как сервер проходит проверку подлинности на клиенте с использованием сертификата X.509.
Образец содержит консольную программу клиента (Client.exe), консольную программу службы маркеров безопасности (Securitytokenservice.exe) и консольную программу службы (Service.exe). Служба реализует контракт, определяющий шаблон взаимодействия "запрос-ответ". Контракт определяется интерфейсом ICalculator
, который предоставляет математические операции (сложение, вычитание, умножение и деление). Клиент получает маркер безопасности от службы маркеров безопасности (STS) и осуществляет синхронные вызовы службы для заданной математической операции, а служба в ответ отправляет результат. Действия клиента отображаются в окне консоли.
![]() |
---|
Процедура настройки и инструкции по построению для данного образца приведены в конце этого раздела. |
Этот образец предоставляет контракт ICalculator, используя элемент wsFederationHttpBinding Element. В следующем коде показана конфигурация этой привязки на клиенте.
<bindings> <wsFederationHttpBinding> <binding name="ServiceFed" > <security mode ="Message"> <message issuedKeyType ="SymmetricKey" issuedTokenType ="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1" > <issuer address ="https://localhost:8000/sts/windows" binding ="wsHttpBinding" /> </message> </security> </binding> </wsFederationHttpBinding></bindings>
В элементе security
привязки wsFederationHttpBinding
значение mode
задает используемый режим безопасности. В этом образце используется безопасность сообщений, и поэтому элемент message
привязки wsFederationHttpBinding
указывается внутри элемента security
привязки wsFederationHttpBinding
. Элемент issuer
привязки wsFederationHttpBinding
в элементе message
привязки wsFederationHttpBinding
задает адрес и привязку для службы маркеров безопасности, которая выдает маркер безопасности клиенту, чтобы клиент мог проверить подлинность службы калькулятора.
В следующем коде показана конфигурация этой привязки на службе.
<bindings> <wsFederationHttpBinding> <binding name="ServiceFed" > <security mode ="Message"> <message issuedKeyType ="SymmetricKey" issuedTokenType ="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1" > <issuerMetadata address ="https://localhost:8000/sts/mex" > <identity> <certificateReference storeLocation ="CurrentUser" storeName="TrustedPeople" x509FindType ="FindBySubjectDistinguishedName" findValue ="CN=STS" /> </identity> </issuerMetadata> </message> </security> </binding> </wsFederationHttpBinding></bindings>
В элементе security
привязки wsFederationHttpBinding
значение mode
задает используемый режим безопасности. В этом образце используется безопасность сообщений, и поэтому элемент message
привязки wsFederationHttpBinding
указывается внутри элемента security
привязки wsFederationHttpBinding
. Элемент issuerMetadata
привязки wsFederationHttpBinding
в элементе message
привязки wsFederationHttpBinding
задает адрес и удостоверение для конечной точки, которая может использоваться с целью извлечения метаданных для службы маркеров безопасности.
Поведение для службы показано в следующем коде.
<behavior name ="ServiceBehavior" > <serviceDebug includeExceptionDetailInFaults ="true"/> <serviceMetadata httpGetEnabled ="true"/> <serviceCredentials> <issuedTokenAuthentication> <knownCertificates> <add storeLocation ="LocalMachine" storeName="TrustedPeople" x509FindType="FindBySubjectDistinguishedName" findValue="CN=STS" /> </knownCertificates> </issuedTokenAuthentication> <serviceCertificate storeLocation ="LocalMachine" storeName ="My" x509FindType ="FindBySubjectDistinguishedName" findValue ="CN=localhost"/> </serviceCredentials></behavior>
Элемент issuedTokenAuthentication
в элементе serviceCredentials
позволяет службе задавать ограничения на маркерах, которые разрешено предоставлять клиентам при проверке подлинности. Эта конфигурация указывает, что службой принимаются маркеры, подписанные сертификатом с именем субъекта "CN=STS".
Служба маркеров безопасности предоставляет единственную конечную точку, используя стандартную привязку wsHttpBinding. Служба маркеров безопасности отвечает на запросы выдачи маркеров от клиентов и осуществляет проверку подлинности клиента с использованием учетной записи Windows, выдавая маркер, содержащий имя пользователя клиента в качестве утверждения в выданном маркере. В одной из частей процедуры создания маркера служба маркеров безопасности подписывает маркер с использованием закрытого ключа, связанного с сертификатом CN=STS. Дополнительно она создает симметричный ключ и шифрует его с использованием открытого ключа, связанного с сертификатом CN=localhost. При возврате маркера клиенту служба маркеров безопасности также возвращает симметричный ключ. Клиент представляет выданный маркер службе калькулятора и подтверждает свое знание симметричного ключа, подписывая сообщение этим ключом.
Пользовательские учетные данные клиента и поставщик маркера
Следующие действия позволяют понять, как разработать пользовательский поставщик маркеров, который кэширует выпущенные маркеры, и интегрировать его с безопасностью WCF.
Разработка пользовательского поставщика маркеров
Создание пользовательского поставщика маркеров.
В этом образце реализован пользовательский поставщик маркеров, который возвращает маркер безопасности, извлекаемый из кэша.
Для выполнения этой задачи пользовательский поставщик маркеров наследует класс SecurityTokenProvider и переопределяет метод GetTokenCore. Этот метод пытается получить маркер из кэша. Если маркер не может быть найден в кэше, метод получает маркер от базового поставщика и кэширует этот маркер. В обоих случаях метод возвращает
SecurityToken
.protected override SecurityToken GetTokenCore(TimeSpan timeout) { GenericXmlSecurityToken token; if (!this.cache.TryGetToken(target, issuer, out token)) { token = (GenericXmlSecurityToken) this.innerTokenProvider.GetToken(timeout); this.cache.AddToken(token, target, issuer); } return token; }
Создание пользовательского диспетчера маркеров безопасности.
Класс SecurityTokenManager используется для создания объекта SecurityTokenProvider для конкретного конструктора SecurityTokenRequirement, который передается в него в методе
CreateSecurityTokenProvider
. Диспетчер маркеров безопасности также используется для создания структур проверки подлинности маркеров и сериализаторов маркеров, но в этом образце они не представлены. В данном образце пользовательский диспетчер маркеров безопасности наследуется от класса ClientCredentialsSecurityTokenManager и переопределяет методCreateSecurityTokenProvider
, возвращающий пользовательский поставщик маркеров, когда переданные требования маркера указывают на запрос выданного маркера.class DurableIssuedTokenClientCredentialsTokenManager : ClientCredentialsSecurityTokenManager { IssuedTokenCache cache; public DurableIssuedTokenClientCredentialsTokenManager ( DurableIssuedTokenClientCredentials creds ): base(creds) { this.cache = creds.IssuedTokenCache; } public override SecurityTokenProvider CreateSecurityTokenProvider ( SecurityTokenRequirement tokenRequirement ) { if (IsIssuedSecurityTokenRequirement(tokenRequirement)) { return new DurableIssuedSecurityTokenProvider ((IssuedSecurityTokenProvider)base.CreateSecurityTokenProvider( tokenRequirement), this.cache); } Else { return base.CreateSecurityTokenProvider(tokenRequirement); } } }
Создание пользовательских учетных данных клиента.
Класс учетных данных клиента используется для представления учетных данных, которые сконфигурированы для прокси клиента, и создает диспетчер маркеров безопасности, который используется для получения структур проверки подлинности маркеров, поставщиков маркеров и сериализаторов маркеров.
public class DurableIssuedTokenClientCredentials : ClientCredentials { IssuedTokenCache cache; public DurableIssuedTokenClientCredentials() : base() { } DurableIssuedTokenClientCredentials ( DurableIssuedTokenClientCredentials other) : base(other) { this.cache = other.cache; } public IssuedTokenCache IssuedTokenCache { Get { return this.cache; } Set { this.cache = value; } } protected override ClientCredentials CloneCore() { return new DurableIssuedTokenClientCredentials(this); } public override SecurityTokenManager CreateSecurityTokenManager() { return new DurableIssuedTokenClientCredentialsTokenManager ((DurableIssuedTokenClientCredentials)this.Clone()); } }
Реализация кэша маркера. Образец реализации использует абстрактный базовый класс, через который потребители данного кэша маркера взаимодействуют с кэшем.
public abstract class IssuedTokenCache { public abstract void AddToken ( GenericXmlSecurityToken token, EndpointAddress target, EndpointAddress issuer); public abstract bool TryGetToken(EndpointAddress target, EndpointAddress issuer, out GenericXmlSecurityToken cachedToken); } Configure the client to use the custom client credential.
Чтобы клиент мог использовать пользовательские учетные данные клиента, образец удаляет класс учетных данных клиента по умолчанию и предоставляет новый класс учетных данных клиента.
clientFactory.Endpoint.Behaviors.Remove<ClientCredentials>(); DurableIssuedTokenClientCredentials durableCreds = new DurableIssuedTokenClientCredentials(); durableCreds.IssuedTokenCache = cache; durableCreds.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerOrChainTrust; clientFactory.Endpoint.Behaviors.Add(durableCreds);
Выполнение образца
См. приведенные инструкции для запуска этого образца. При выполнении образца запрос маркера безопасности показан в окне консоли службы маркеров безопасности. Запросы и ответы операций отображаются в окнах консоли клиента и службы. Чтобы закрыть приложение, нажмите клавишу ВВОД в любом из окон консоли.
Пакетный файл Setup.cmd
Входящий в состав образца пакетный файл Setup.cmd позволяет настроить сервер и службу маркеров безопасности с соответствующими сертификатами, необходимыми для выполнения резидентного приложения. Пакетный файл создает два сертификата, оба в хранилище сертификатов CurrentUser/TrustedPeople. Имя субъекта первого сертификата CN=STS, он используется службой маркеров безопасности, чтобы подписывать маркеры безопасности, выдаваемые клиенту. Имя субъекта второго сертификата CN=localhost, он используется службой маркеров безопасности для шифрования секрета, чтобы служба могла его дешифровать.
Настройка, построение и выполнение образца
Запустите файл Setup.cmd, чтобы создать требуемые сертификаты.
Чтобы выполнить построение решения, следуйте инструкциям раздела Построение образцов Windows Communication Foundation. Убедитесь, что все проекты в решении построены (Shared, RSTRSTR, Service, SecurityTokenService и Client).
Убедитесь в том, что Service.exe и SecurityTokenService.exe запущены с правами администратора.
Запустите Client.exe.
Очистка после образца
- После завершения работы образца запустите в папке образцов файл Cleanup.cmd.
![]() |
---|
Образцы уже могут быть установлены на компьютере. Перед продолжением проверьте следующий каталог (по умолчанию).
<диск_установки>:\WF_WCF_Samples
Если этот каталог не существует, перейдите на страницу Образцы Windows Communication Foundation (WCF) и Windows Workflow Foundation (WF) для .NET Framework 4, чтобы загрузить все образцы Windows Communication Foundation (WCF) и WF. Этот образец расположен в следующем каталоге.
<диск_установки>:\WF_WCF_Samples\WCF\Extensibility\Security\DurableIssuedTokenProvider
|