Образец идентификации службы

В этом образце удостоверения службы демонстрируется, как назначить удостоверение для службы. Во время разработки клиент может получить удостоверение с помощью метаданных службы, а затем во время выполнения клиент может пройти проверку подлинности удостоверения службы. Концепция удостоверения службы позволяет клиенту проверять подлинность службы перед вызовом любых ее операций, защищая таким образом клиента от вызовов, не прошедших проверку подлинности. При безопасном подключении служба также проводит проверку подлинности учетных данных клиента перед тем, как предоставить им доступ. Однако это выходит за рамки данного образца. Ознакомьтесь с примерами в клиенте , где показана проверка подлинности сервера.

Примечание.

Процедура настройки и инструкции по построению для данного образца приведены в конце этого раздела.

В этом образце демонстрируются следующие возможности.

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

  • Удостоверение может быть задано как декларативно в конфигурации, так и императивно в коде. Обычно используется конфигурация для назначения удостоверения как для клиента, так и для службы.

  • Как назначить пользовательское удостоверение клиенту. Пользовательское удостоверение обычно представляет собой настройку существующего типа удостоверения, которое позволяет клиенту анализировать оставшуюся информацию об утверждениях, передаваемых в учетных данных службы, позволяя принимать решение об авторизации до момента вызова службы.

    Примечание.

    Этот образец проверяет удостоверение конкретного сертификата identity.com и ключ RSA, который содержится в этом сертификате. При использовании типов удостоверений Certificate и RSA в конфигурации клиента самый простой способ получить эти значения - проверить WSDL для службы, где эти значения сериализуются.

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

//Create a service endpoint and set its identity to the certificate's DNS
WSHttpBinding wsAnonbinding = new WSHttpBinding (SecurityMode.Message);
// Client are Anonymous to the service
wsAnonbinding.Security.Message.ClientCredentialType = MessageCredentialType.None;
WServiceEndpoint ep = serviceHost.AddServiceEndpoint(typeof(ICalculator),wsAnonbinding, String.Empty);
EndpointAddress epa = new EndpointAddress(dnsrelativeAddress,EndpointIdentity.CreateDnsIdentity("identity.com"));
ep.Address = epa;

Удостоверение может быть также задано в конфигурации в файле App.config. В следующем примере показано, как задать удостоверение "имя участника-пользователя" (UPN) для конечной точки службы.

<endpoint address="upnidentity"
        behaviorConfiguration=""
        binding="wsHttpBinding"
        bindingConfiguration="WSHttpBinding_Windows"
        name="WSHttpBinding_ICalculator_Windows"
        contract="Microsoft.ServiceModel.Samples.ICalculator">
  <!-- Set the UPN identity for this endpoint -->
  <identity>
      <userPrincipalName value="host\myservice.com" />
  </identity >
</endpoint>

Пользовательское удостоверение может быть создано на клиенте путем наследования от классов EndpointIdentity и IdentityVerifier. В принципе, класс IdentityVerifier может рассматриваться в качестве клиента, эквивалентного классу службы AuthorizationManager. В следующем примере кода показана реализация метода OrgEndpointIdentity, хранящего имя организации, которому должно соответствовать имя субъекта сертификата сервера. Авторизация проверяет появление имени организации в методе CheckAccess в классе CustomIdentityVerifier.

// This custom EndpointIdentity stores an organization name
public class OrgEndpointIdentity : EndpointIdentity
{
    private string orgClaim;
    public OrgEndpointIdentity(string orgName)
    {
        orgClaim = orgName;
    }
    public string OrganizationClaim
    {
        get { return orgClaim; }
        set { orgClaim = value; }
    }
}

//This custom IdentityVerifier uses the supplied OrgEndpointIdentity to
//check that X.509 certificate's distinguished name claim contains
//the organization name e.g. the string value "O=Contoso"
class CustomIdentityVerifier : IdentityVerifier
{
    public override bool CheckAccess(EndpointIdentity identity, AuthorizationContext authContext)
    {
        bool returnvalue = false;
        foreach (ClaimSet claimset in authContext.ClaimSets)
        {
            foreach (Claim claim in claimset)
            {
                if (claim.ClaimType == "http://schemas.microsoft.com/ws/2005/05/identity/claims/x500distinguishedname")
                {
                    X500DistinguishedName name = (X500DistinguishedName)claim.Resource;
                    if (name.Name.Contains(((OrgEndpointIdentity)identity).OrganizationClaim))
                    {
                        Console.WriteLine("Claim Type: {0}",claim.ClaimType);
                        Console.WriteLine("Right: {0}", claim.Right);
                        Console.WriteLine("Resource: {0}",claim.Resource);
                        Console.WriteLine();
                        returnvalue = true;
                    }
                }
            }
        }
        return returnvalue;
    }
}

Этот образец использует сертификат identity.com, который находится в соответствующей языковой папке решения для идентификации.

Настройка, сборка и выполнение образца

  1. Убедитесь, что вы выполнили процедуру однократной установки для примеров Windows Communication Foundation.

  2. Чтобы создать выпуск решения на языке C# или Visual Basic .NET, следуйте инструкциям в разделе Building the Windows Communication Foundation Samples.

  3. Чтобы запустить пример в конфигурации с одним или несколькими компьютерами, следуйте инструкциям в разделе "Примеры Windows Communication Foundation".

Запуск образца на одном компьютере

  1. В Windows XP или Windows Vista импортируйте файл сертификата Identity.pfx в папку решения удостоверений в хранилище сертификатов LocalMachine/My (Personal) с помощью средства оснастки MMC. Этот файл защищен паролем. Во время импорта будет запрошен пароль. Введите xyz в поле пароля. Дополнительные сведения см. в разделе " Практическое руководство. Просмотр сертификатов с помощью оснастки MMC". После этого запустите Setup.bat в командной строке разработчика для Visual Studio с правами администратора, которая копирует этот сертификат в хранилище CurrentUser/Trusted Люди для использования на клиенте.

  2. В Windows Server 2003 запустите Setup.bat из образца папки установки в командной строке Visual Studio с правами администратора. При этом устанавливаются все сертификаты, необходимые для выполнения образца.

    Примечание.

    Пакетный файл Setup.bat предназначен для запуска из командной строки Visual Studio. Переменная среды PATH в командной строке Visual Studio указывает на каталог, содержащий исполняемые файлы, необходимые скрипту Setup.bat. После завершения работы образца выполните в папке образца файл Cleanup.bat, чтобы удалить сертификаты. В других образцах обеспечения безопасности используются те же сертификаты.

  3. Запустите программу Service.exe из каталога \service\bin. Убедитесь, что служба готова и отображает запрос на нажатие клавиши <ВВОД> , чтобы завершить работу службы.

  4. Запустите файл Client.exe из каталога \client\bin, или нажав F5 в Visual Studio для построения и выполнения примера. Действия клиента отображаются в консольном приложении клиента.

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

Запуск образца на нескольких компьютерах

  1. Перед тем как построить клиентскую часть образца, убедитесь в изменении значения адреса конечной точки службы в файле Client.cs в методе CallServiceCustomClientIdentity. После этого постройте образец.

  2. Создайте каталог на компьютере службы.

  3. Скопируйте файлы служебной программ из каталога service\bin в каталог на компьютере службы. Кроме того, скопируйте файлы Setup.bat и Cleanup.bat на компьютер службы.

  4. Создайте на клиентском компьютере каталог для двоичных файлов клиента.

  5. Скопируйте в клиентский каталог на клиентском компьютере файлы программы клиента. Кроме того, скопируйте на клиент файлы Setup.bat, Cleanup.bat и ImportServiceCert.bat.

  6. В службе запустите setup.bat service командную строку разработчика для Visual Studio, открываемую с правами администратора. При выполнении setup.bat с service аргументом создается сертификат службы с полным доменным именем компьютера и экспортируется сертификат службы в файл с именем Service.cer.

  7. Скопируйте файл Service.cer из каталога службы в клиентский каталог на клиентском компьютере.

  8. В файле Client.exe.config на клиентском компьютере измените значение адреса конечной точки, чтобы оно соответствовало новому адресу службы. Есть несколько экземпляров, которые должны быть изменены.

  9. На клиенте запустите ImportServiceCert.bat в командной строке разработчика для Visual Studio, открытой с правами администратора. Он импортирует сертификат службы из файла Service.cer в хранилище CurrentUser - TrustedPeople.

  10. На компьютере службы запустите из командной строки программу Service.exe.

  11. На клиентском компьютере из командной строки запустите программу Client.exe. Если клиент и служба не могут взаимодействовать, ознакомьтесь с Советы устранения неполадок для примеров WCF.

Очистка после образца

  • После завершения работы примера запустите в папке примеров файл Cleanup.bat.

    Примечание.

    Этот скрипт не удаляет сертификаты службы на клиенте при запуске образца на нескольких компьютерах. Если вы выполнили примеры Windows Communication Foundation (WCF), использующие сертификаты на компьютерах, обязательно снимите сертификаты службы, установленные в хранилище CurrentUser — доверенный Люди. Для этого воспользуйтесь следующей командой: certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name>. Например: certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.