Переопределите удостоверение службы для проверки подлинности
Как правило, нет необходимости задавать удостоверение в службе, поскольку выбор типа учетных данных клиента определяет тип удостоверения, предоставляемого в метаданных службы. Например, следующий код конфигурации использует <элемент wsHttpBinding> и задает clientCredentialType
атрибут Windows.
В следующем фрагменте WSDL (Web Services Description Language) показано удостоверение для ранее определенной конечной точки. В этом примере служба выполняется как локальная служба в определенной учетной записи пользователя (username@contoso.com
) и, следовательно, удостоверение участника-пользователя содержит имя учетной записи. Имя участника-пользователя также называется именем входа пользователя в домене Windows.
Пример приложения, демонстрирующего параметры удостоверения, см. в примере удостоверения службы. Дополнительные сведения об удостоверении службы см. в разделе "Удостоверение службы" и "Проверка подлинности".
Проверка подлинности Kerberos и удостоверение
По умолчанию, когда служба настроена на использование учетных данных Windows, элемент удостоверения>, содержащий< элемент userPrincipalName> или <servicePrincipalName>, <создается в WSDL. Если служба выполняется под LocalSystem
учетной записью , NetworkService
LocalService
имя субъекта-службы (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