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

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

Замечание

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

В этом примере показаны следующие функции:

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

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

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

    Замечание

    В этом примере проверяется удостоверение определенного сертификата, называемого 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 (User Principal Name) для конечной точки службы.

<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. Убедитесь, что вы выполнили процедуру настройки One-Time для образцов Windows Communication Foundation.

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

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

Запуск примера на том же компьютере

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

  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 — TrustedPeople. Для этого используйте следующую команду: certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name> Например, certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.