Идентификация и проверка подлинности службы

Удостоверение конечной точки службы — это значение, созданное на языке описания веб-служб (WSDL). Это значение распространяется по всем клиентам и используется для проверки подлинности службы. После того как клиент инициирует связь с конечной точкой и служба пройдет проверку подлинности на клиенте, клиент сравнивает значение удостоверения конечной точки с действительным значением, возвращенным процессом проверки подлинности конечной точки. Если значения совпадают, значит клиент связался с ожидаемой конечной точкой службы. Эта функция является защитой от фишинга путем предотвращения перенаправления клиента на конечную точку, размещенную вредоносной службой.

Пример приложения, демонстрирующего параметры удостоверения, см. в примере удостоверения службы. Дополнительные сведения о конечных точках и адресах конечных точек см. в разделе "Адреса".

Примечание.

При использовании NT LanMan (NTLM) для проверки подлинности удостоверение службы не проверяется, так как в NTLM проверка подлинности сервера клиентом не поддерживается. NTLM используется, когда компьютеры входят в рабочую группу Windows или при работе в старых версиях Windows, не поддерживающих проверку подлинности Kerberos.

Когда клиент инициирует безопасный канал для отправки сообщения в службу по нему, инфраструктура Windows Communication Foundation (WCF) выполняет проверку подлинности службы и отправляет сообщение только в том случае, если удостоверение службы соответствует идентификатору, указанному в адресе конечной точки, который использует клиент.

Обработка удостоверений включает следующие этапы.

  • Во время проектирования разработчик клиента определяет удостоверение службы на основе метаданных конечной точки (передаваемых через WSDL).

  • Во время выполнения клиентское приложение проверка утверждения учетных данных безопасности службы перед отправкой сообщений в службу.

Обработка идентификаций на клиенте аналогична проверке подлинности клиента в службе. Защищенная служба не выполняет код до тех пор, пока не будет проведена проверка подлинности учетных данных клиента. Аналогично, клиент не отправляет сообщения службе до тех пор, пока не будет проведена проверка подлинности учетных данных службы, исходя из заранее известной информации на основе метаданных службы.

Свойство Identity класса EndpointAddress представляет удостоверение службы, вызываемой клиентом. Служба публикует свойство Identity в своих метаданных. Когда разработчик клиента запускает средство служебной программы метаданных ServiceModel (Svcutil.exe) для конечной точки службы, созданная конфигурация содержит значение свойства службы Identity . Инфраструктура WCF (если настроена с безопасностью) проверяет, обладает ли служба указанным удостоверением.

Внимание

Метаданные содержат ожидаемое удостоверение службы, поэтому рекомендуется передавать метаданные службы через защищенные средства, например путем создания конечной точки HTTPS для службы. Дополнительные сведения см. в разделе "Практическое руководство. Защита конечных точек метаданных".

Типы удостоверений

Служба может предоставлять шесть типов удостоверений. Каждый тип удостоверения соответствует элементу, который может содержаться в элементе <identity> в конфигурации. Используемый тип зависит от сценария и требований службы к безопасности. Типы удостоверений описаны в приведенной ниже таблице.

Тип удостоверения Description Типичный сценарий
Служба доменных имен (DNS) Этот элемент следует использовать с сертификатами X.509 или учетными записями Windows. Он сравнивает DNS-имя, указанное в учетных данных, со значением, указанным в этом элементе. Проверка DNS позволяет использовать сертификаты с DNS-именами или именами субъектов. Если сертификат повторно выдан с тем же DNS-именем или именем субъекта, тогда проверка удостоверения по-прежнему действительна. При повторной выдаче сертификата он получает новый ключ RSA, однако при этом сохраняется то же DNS-имя или имя субъекта. Это означает, что клиентам не нужно обновлять в удостоверении информацию о службе.
Сертификат. Используется по умолчанию, если параметру ClientCredentialType присвоено значение "Certificate". Этот элемент задает значение сертификата X.509 в кодировке Base64 для сравнения с клиентом.

Кроме того, этот элемент используется при использовании CardSpace в качестве учетных данных для проверки подлинности службы.
Этот элемент ограничивает проверку подлинности одним сертификатом на основе значения отпечатка. Это обеспечивает более строгую проверку подлинности, поскольку значения отпечатков уникальны. При этом следует учитывать следующее: если сертификат был повторно выдан с тем же именем субъекта, у него тем не менее будет новый отпечаток. Следовательно, клиенты могут проверить службу только в том случае, когда известен новый отпечаток. Дополнительные сведения о поиске отпечатка сертификата см. в разделе "Практическое руководство. Извлечение отпечатка сертификата".
Ссылка на сертификат Идентичен описанному выше типу "Сертификат". Однако этот элемент позволяет задавать имя сертификата и сохранять расположение, из которого нужно получать сертификат. Аналогичен описанному выше сценарию для типа "Сертификат".

Преимущество в том, что есть возможность изменить расположение хранилища сертификатов.
RSA Этот элемент задает значение ключа RSA для сравнения с клиентом. Он аналогичен типу "Сертификат", однако вместо использования отпечатка сертификата используется ключ RSA сертификата. Проверка RSA позволяет ограничить проверку подлинности одним сертификатом с использованием его ключа RSA. Это позволяет выполнять более строгую проверку подлинности определенного ключа RSA, однако если значение ключа RSA будет изменено, служба больше не будет работать с существующими клиентами.
Имя участника-пользователя (UPN). Используется по умолчанию, если параметру ClientCredentialType присвоено значение "Windows" и процесс службы выполняется не под одной из системных учетных записей. Этот элемент задает имя участника-пользователя, под которым выполняется служба. См. раздел "Протокол Kerberos" и "Удостоверение", посвященный переопределении удостоверения службы для проверки подлинности. Это обеспечивает выполнение службы под определенной учетной записью пользователя Windows. В качестве учетной записи может использоваться либо учетная запись текущего пользователя, либо служба, запущенная под учетной записью определенного пользователя.

Для этого параметра используется безопасность Windows Kerberos, если служба выполняется под учетной записью домена в среде Active Directory.
Имя участника-службы. Используется по умолчанию, если параметру ClientCredentialType присвоено значение "Windows" и процесс службы выполняется под одной из системных учетных записей: LocalService, LocalSystem или NetworkService. Этот элемент задает имя участника-службы, связанное с учетной записью службы. См. раздел "Протокол Kerberos" и "Удостоверение", посвященный переопределении удостоверения службы для проверки подлинности. Это обеспечивает идентификацию службы с помощью имени участника-службы и определенной учетной записи Windows, связанной с этим именем.

Для связывания учетной записи компьютера для учетной записи пользователя службы можно воспользоваться средством Setspn.exe.

Этот параметр использует безопасность Windows Kerberos, если служба выполняется под одной из системных учетных записей или под учетной записью домена, с которой связано имя участника-службы, при условии что компьютер входит в домен в среде Active Directory.

Задание удостоверения в службе

Как правило, нет необходимости задавать удостоверение в службе, поскольку выбор типа учетных данных клиента определяет тип удостоверения, предоставляемого в метаданных службы. Дополнительные сведения о переопределении или указании удостоверения службы см. в разделе "Переопределение удостоверения службы для проверки подлинности".

<Использование элемента удостоверения> в конфигурации

Если изменить тип учетных данных клиента в привязке, ранее показанной сертификату Certificate, созданный WSDL будет содержать сериализованный сертификат X.509 в кодировке Base64, соответствующий значению удостоверения, как показано в следующем примере кода. Используется по умолчанию для всех типов учетных данных клиентов, за исключением Windows.

Вы можете изменить значение удостоверения службы по умолчанию или изменить тип удостоверения, используя <identity> элемент в конфигурации или задав удостоверение в коде. В следующем коде конфигурации задается идентификатор DNS со значением contoso.com.

Задание удостоверения программным способом

Службе не нужно явно указывать удостоверение, так как WCF автоматически определяет его. При необходимости WCF позволяет указать удостоверение в конечной точке. В приведенном ниже примере кода добавляется новая конечная точка службы с определенным идентификатором DNS.

ServiceEndpoint ep = myServiceHost.AddServiceEndpoint(
                typeof(ICalculator),
                new WSHttpBinding(),
                String.Empty);
EndpointAddress myEndpointAdd = new EndpointAddress(new Uri("http://localhost:8088/calc"),
     EndpointIdentity.CreateDnsIdentity("contoso.com"));
ep.Address = myEndpointAdd;
Dim ep As ServiceEndpoint = myServiceHost.AddServiceEndpoint(GetType(ICalculator), New WSHttpBinding(), String.Empty)
Dim myEndpointAdd As New EndpointAddress(New Uri("http://localhost:8088/calc"), EndpointIdentity.CreateDnsIdentity("contoso.com"))
ep.Address = myEndpointAdd

Назначение удостоверения в клиенте

Во время разработки разработчик клиента обычно использует средство служебной программы метаданных ServiceModel (Svcutil.exe) для создания конфигурации клиента. Созданный файл конфигурации (предназначенный для использования клиентом) содержит удостоверение сервера. Например, приведенный ниже код создан на основе службы, в которой задан идентификатор DNS, как показано в предыдущем примере. Обратите внимание, что значение удостоверения конечной точки клиента совпадает с соответствующим значением службы. В этом случае, когда клиент получает учетные данные Windows (Kerberos) для службы, он ожидает значение contoso.com.

Если вместо Windows сертификат в службе задан в качестве клиентского типа учетных данных, тогда ожидается, что свойство DNS будет иметь значение contoso.com. (Если же свойство DNS имеет значение null, имя субъекта сертификата должно иметь значение contoso.com.)

Использование определенного значения для удостоверения

В приведенном ниже файле конфигурации клиента показано, каким образом в качестве удостоверения службы может ожидаться использование определенного значения. В приведенном ниже примере клиент может связываться с двумя конечными точками. Первая конечная точка определяется отпечатком сертификата, а вторая – ключом RSA сертификата. Другими словами, сертификатом, содержащим только пару открытого и закрытого ключей, который не был издан доверенным центром.

Проверка удостоверения во время выполнения

Во время проектирования разработчик клиента определяет удостоверение сервера с помощью его метаданных. Во время выполнения удостоверение проверка выполняется перед вызовом любых конечных точек в службе.

Значение удостоверения привязано к типу проверки подлинности, указанному в метаданных; другими словами, к типу учетных данных, используемому в службе.

Если в канале настроена проверка подлинности с использованием протокола SSL на уровне сообщений или транспортном уровне с сертификатами X.509, действительны следующие значения удостоверения.

  • DNS. WCF гарантирует, что сертификат, предоставленный во время подтверждения SSL, содержит атрибут DNS или CommonName (CN), равный значению, указанному в удостоверении DNS на клиенте. Обратите внимание, что эти проверки выполняются в дополнение к определению действительности сертификата сервера. По умолчанию WCF проверяет, выдан ли сертификат сервера доверенным корневым центром.

  • Сертификат. Во время подтверждения SSL WCF гарантирует, что удаленная конечная точка предоставляет точное значение сертификата, указанное в удостоверении.

  • Ссылка на сертификат. Аналогичен значению "Сертификат".

  • RSA. Во время подтверждения SSL WCF гарантирует, что удаленная конечная точка предоставляет точный ключ RSA, указанный в удостоверении.

Если служба выполняет проверку подлинности с использованием протокола SSL на уровне сообщений или транспортном уровне с учетными данными Windows и согласует учетные данные, следующие значения удостоверения являются действительными.

  • DNS. Согласование проходит имя участника-службы, так что DNS-имя может быть проверено. Имя участника-службы указывается в формате host/<dns name>.

  • Имя участника-службы. Возвращается явное имя участника-службы, например host/myservice.

  • Имя участника-пользователя. Имя участника-пользователя учетной записи службы. Имя участника-участника-участника находится в форме username@domain. Например, при выполнении службы под учетной записью пользователя может использоваться такое имя участника-пользователя, как username@contoso.com.

Назначать удостоверение программным путем (с использованием свойства Identity) не обязательно. Если удостоверение не задано и используется тип учетных данных клиента Windows, по умолчанию имени участника-службы назначается значение, соответствующее имени узла в адресе конечной точки службы с префиксом "host/". Если удостоверение задано и в качестве типа учетных данных клиента применяется сертификат, по умолчанию используется значение Certificate. Это относится к безопасности как на уровне сообщений, так и на транспортном уровне.

Удостоверение и пользовательские привязки

Поскольку удостоверение службы зависит от используемого типа привязки, при создании пользовательской привязки убедитесь, что передается требуемое удостоверение. Например, в приведенном ниже примере кода передаваемое удостоверение несовместимо с типом безопасности, поскольку удостоверение для привязки начальной загрузки защищенного диалога не соответствует удостоверению для привязки на конечной точке. Привязка защищенного диалога назначает идентификатор DNS, тогда как WindowsStreamSecurityBindingElement назначает удостоверение имени участника-пользователя или участника-службы.

CustomBinding binding = new CustomBinding();
// The following binding exposes a DNS identity.
binding.Elements.Add(SecurityBindingElement.
    CreateSecureConversationBindingElement(
    SecurityBindingElement.
    CreateIssuedTokenForSslBindingElement(
    new IssuedSecurityTokenParameters())));

// The following element requires a UPN or SPN identity.
binding.Elements.Add(new WindowsStreamSecurityBindingElement());
binding.Elements.Add(new TcpTransportBindingElement());
Dim binding As New CustomBinding()
' The following binding exposes a DNS identity.
binding.Elements.Add(SecurityBindingElement.CreateSecureConversationBindingElement(SecurityBindingElement.CreateIssuedTokenForSslBindingElement(New IssuedSecurityTokenParameters())))

' The following element requires a UPN or SPN identity.
binding.Elements.Add(New WindowsStreamSecurityBindingElement())
binding.Elements.Add(New TcpTransportBindingElement())

Дополнительные сведения о том, как правильно стекать элементы привязки для пользовательской привязки, см. в разделе "Создание определяемых пользователем привязок". Дополнительные сведения о создании пользовательской привязки с помощью инструкций SecurityBindingElementсм. в разделе "Практическое руководство. Создание securityBindingElement для указанного режима проверки подлинности".

См. также