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

Как правило, нет необходимости задавать удостоверение в службе, поскольку выбор типа учетных данных клиента определяет тип удостоверения, предоставляемого в метаданных службы. Например, следующий код конфигурации использует <элемент wsHttpBinding> и задает clientCredentialType атрибут Windows.

В следующем фрагменте WSDL (Web Services Description Language) показано удостоверение для ранее определенной конечной точки. В этом примере служба выполняется как локальная служба в определенной учетной записи пользователя (username@contoso.com) и, следовательно, удостоверение участника-пользователя содержит имя учетной записи. Имя участника-пользователя также называется именем входа пользователя в домене Windows.

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

Проверка подлинности Kerberos и удостоверение

По умолчанию, когда служба настроена на использование учетных данных Windows, элемент удостоверения>, содержащий< элемент userPrincipalName> или <servicePrincipalName>, <создается в WSDL. Если служба выполняется под LocalSystemучетной записью , NetworkServiceLocalServiceимя субъекта-службы (SPN) создается по умолчанию в виде host/<имени> узла, так как эти учетные записи имеют доступ к данным субъекта-службы компьютера. Если служба выполняется под другой учетной записью, Windows Communication Foundation (WCF) создает имя участника-пользователя в виде <имени пользователя>@<domainName>. Это происходит потому, что проверка подлинности Kerberos требует предоставления клиенту имени участника-пользователя или имени участника-службы для проверки подлинности службы.

Вы также можете использовать средство Setpn для регистрации дополнительного субъекта-службы в учетной записи службы в домене. В этом случае имя участника-службы можно использовать в качестве удостоверения службы. Дополнительные сведения о средстве см. в разделе "Общие сведения о Setpn".

Примечание.

Чтобы использовать тип учетных данных Windows без согласования, учетная запись пользователя службы должна иметь доступ к имени участника службы (SPN), зарегистрированному с доменом Active Directory. Это можно выполнить следующими способами:

  • Используйте учетную запись NetworkService или LocalSystem для запуска службы. Так как эти учетные записи имеют доступ к имени субъекта-службы компьютера, который устанавливается при присоединении компьютера к домену Active Directory, WCF автоматически создает соответствующий элемент spN внутри конечной точки службы в метаданных службы (WSDL).

  • Запустите службу из любой учетной записи домена Active Directory. В данном случае с помощью служебного средства Setspn.exe необходимо установить имя участника-службы для этой учетной записи домена. Создав имя субъекта-службы для учетной записи службы, настройте WCF для публикации этого имени участника-службы клиентам службы через его метаданные (WSDL). Для этого нужно настроить удостоверение конечной точки для предоставляемой конечной точки в файле конфигурации приложения или в коде.

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

Если имя участника-службы или имя участника-пользователя равно пустой строке

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

  • Если используется безопасность на уровне транспорта, выбирается проверка подлинности по протоколу NT LanMan (NTLM).

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

  • Если используется spnego режим, а AllowNtlm атрибут задан false, проверка подлинности завершается ошибкой.

  • Если используется spnego режим, а AllowNtlm атрибут задан true, проверка подлинности завершается ошибкой, если имя участника-пользователя пусто, но завершается успешно, если имя участника-службы пусто.

  • При использовании протокола Kerberos напрямую (этот процесс также известен как "одноступенчатая" проверка) происходит сбой проверки подлинности.

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

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

См. также