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

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

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

Примечание.

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

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

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

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

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

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

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

Внимание

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

Типы идентичности

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

Тип удостоверения Описание Типичный сценарий
Служба доменных имен (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" и процесс службы выполняется не под одной из системных учетных записей. Этот элемент указывает UPN, под которым работает служба. См. раздел "Протокол Kerberos" и "Удостоверение", посвященный переопределении удостоверения службы для проверки подлинности. Это обеспечивает выполнение службы под определенной учетной записью пользователя Windows. В качестве учетной записи может использоваться либо учетная запись текущего пользователя, либо служба, запущенная под учетной записью определенного пользователя.

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

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

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

Указание идентичности для службы

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

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

Если изменить тип учетных данных клиента в привязке, показанной ранее в Certificate, то созданный WSDL будет содержать сериализованный в Base64 сертификат X.509 для значения удостоверения, как это показано в следующем коде. Используется по умолчанию для всех типов учетных данных клиентов, за исключением 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. В процессе согласования передается имя принципала службы (SPN), чтобы можно было проверить DNS-имя. Идентификатор участника-службы указывается в формате host/<dns name>.

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

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

Указание идентификатора программным путем (с использованием свойства Identity) является необязательным. Если идентификатор не указан, и тип учетных данных клиента — Windows, по умолчанию используется SPN со значением, равным части имени хоста в адресе конечной точки службы с префиксом "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 для указанного режима проверки подлинности.

См. также