Поделиться через


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

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

<configuration>
<system.serviceModel>
  <bindings>
    <wsHttpBinding>
      <binding name="WSHttpBinding_Windows">
        <security mode="Message">
          <message clientCredentialType="Windows"
                   establishSecurityContext="false"/>
        </security>
      </binding>
    </wsHttpBinding>
  </bindings>
  <!-- other configuration code not shown -->
</system.serviceModel>
</configuration>

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

<wsdl:service name="CalculatorService">
  <wsdl:port name="WSHttpBinding_ICalculator_Windows"
    binding="tns:WSHttpBinding_ICalculator_Windows">
    <soap12:address 
      location=
      "https://localhost:8003/servicemodelsamples/service/upnidentity" />
    <wsa10:EndpointReference>
      <wsa10:Address>
        https://localhost:8003/servicemodelsamples/service/upnidentity
      </wsa10:Address>
      <Identity  
        xmlns="https://schemas.xmlsoap.org/ws/2006/02/addressingidentity">
        <Upn>username@contoso.com</Upn>
      </Identity>
    </wsa10:EndpointReference>
  </wsdl:port>
</wsdl:service>

Пример приложения, в котором демонстрируется настройка удостоверения, см. в разделе Образец идентификации службы. Дополнительные сведения удостоверении службы см. в разделе Идентификация и проверка подлинности службы.

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

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

Также для регистрации дополнительного имени участника-службы с учетной записью службы в домене можно использовать средство Setspn.exe. В этом случае имя участника-службы можно использовать в качестве удостоверения службы. Чтобы загрузить это средство, см. ссылку Windows 2000 Resource Kit Tool: Setspn.exe. Дополнительные сведения этом средстве см. в разделе Общие сведения о Setspn.

Bb628618.note(ru-ru,VS.100).gifПримечание
Чтобы использовать тип учетных данных Windows без согласования, учетная запись пользователя службы должна иметь доступ к имени участника службы (SPN), зарегистрированному с доменом Active Directory. Это можно сделать одним из перечисленных ниже способов.

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

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

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

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

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

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

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

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

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

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

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

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

<Identity xmlns="https://schemas.xmlsoap.org/ws/2006/02/addressingidentity">
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
 <X509Data>
 <X509Certificate>MIIBxjCCAXSgAwIBAgIQmXJgyu9tro1M98GifjtuoDAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTA2MDUxNzIxNDQyNVoXDTM5MTIzMTIzNTk1OVowKTEQMA4GA1UEChMHQ29udG9zbzEVMBMGA1UEAxMMaWRlbnRpdHkuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDBmivcb8hYbh11hqVoDuB7zmJ2y230f/b4e+4P6yXtKKuhUdYcIqc8mAforIM4WWJEVGeJVq9sFEwqrL5Ryid8jMTRwPLvA/x/wvj1gtD1GWJ+aUh2pqieiGL7MWTepHAQBIibUxgOrAOz0j9Xhg0iDFYScdYUjeqI3yZIDC7WbwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBADB/J2QjdSPL8Doj3pAveCXd/5fY03eo9kUym/Tmb4ubdqsObri0qnYR/n8Wxsa1yJ4Dks6cNBTPS4l5B7zUeNo=</X509Certificate> 
 </X509Data>
</KeyInfo>
</Identity>

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

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

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

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

См. также

Задачи

Как создать пользовательское средство проверки идентификации клиентов

Основные понятия

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