Поставщик членства и ролей

В примере поставщика членства и ролей показано, как служба может использовать ASP.NET поставщиков членства и ролей для проверки подлинности и авторизации клиентов.

В этом образце клиентом является консольное приложение (EXE), а служба размещается в службах IIS.

Примечание.

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

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

  • Клиент может проходить проверку подлинности по имени пользователя и паролю.

  • Сервер может проверить учетные данные клиента в отношении поставщика членства ASP.NET.

  • Сервер может проходить проверку подлинности с помощью сертификата X.509 сервера.

  • Сервер может сопоставить прошедший проверку подлинности клиент с ролью с помощью поставщика ролей ASP.NET.

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

Поставщики членства и ролей настраиваются на использование хранилища на базе SQL Server. Строка подключения и другие параметры задаются в файле конфигурации службы. Поставщик участия получает имя SqlMembershipProvider, а поставщик ролей - имя SqlRoleProvider.

<!-- Set the connection string for SQL Server -->
<connectionStrings>
  <add name="SqlConn"
       connectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=aspnetdb;" />
</connectionStrings>

<system.web>
  <!-- Configure the Sql Membership Provider -->
  <membership defaultProvider="SqlMembershipProvider" userIsOnlineTimeWindow="15">
    <providers>
      <clear />
      <add
        name="SqlMembershipProvider"
        type="System.Web.Security.SqlMembershipProvider"
        connectionStringName="SqlConn"
        applicationName="MembershipAndRoleProviderSample"
        enablePasswordRetrieval="false"
        enablePasswordReset="false"
        requiresQuestionAndAnswer="false"
        requiresUniqueEmail="true"
        passwordFormat="Hashed" />
    </providers>
  </membership>

  <!-- Configure the Sql Role Provider -->
  <roleManager enabled ="true"
               defaultProvider ="SqlRoleProvider" >
    <providers>
      <add name ="SqlRoleProvider"
           type="System.Web.Security.SqlRoleProvider"
           connectionStringName="SqlConn"
           applicationName="MembershipAndRoleProviderSample"/>
    </providers>
  </roleManager>
</system.web>

Служба предоставляет одну конечную точку для взаимодействия с ней. Эта точка задается в файле конфигурации Web.config. Конечная точка состоит из адреса, привязки и контракта. Привязка настраивается с помощью стандартного элемента wsHttpBinding, который по умолчанию использует проверку подлинности Windows. В этом образце стандартная привязка wsHttpBinding использует проверку подлинности имени пользователя. Поведение определяет, что для проверки подлинности службы должен использоваться сертификат сервера. Сертификат сервера должен содержать то же значение, что и атрибут SubjectName в элементе< конфигурации serviceCertificate>.findValue Кроме того, поведение указывает, что проверка подлинности пар имени пользователя и паролей выполняется поставщиком членства ASP.NET и сопоставлением ролей выполняется поставщиком ролей ASP.NET путем указания имен, определенных для двух поставщиков.

<system.serviceModel>

  <protocolMapping>
    <add scheme="http" binding="wsHttpBinding" />
  </protocolMapping>

  <bindings>
    <wsHttpBinding>
      <!-- Set up a binding that uses Username as the client credential type -->
      <binding>
        <security mode ="Message">
          <message clientCredentialType ="UserName"/>
        </security>
      </binding>
    </wsHttpBinding>
  </bindings>

  <behaviors>
    <serviceBehaviors>
      <behavior>
        <!-- Configure role based authorization to use the Role Provider -->
        <serviceAuthorization principalPermissionMode ="UseAspNetRoles"
                              roleProviderName ="SqlRoleProvider" />
        <serviceCredentials>
          <!-- Configure user name authentication to use the Membership Provider -->
          <userNameAuthentication userNamePasswordValidationMode ="MembershipProvider"
                                  membershipProviderName ="SqlMembershipProvider"/>
          <!-- Configure the service certificate -->
          <serviceCertificate storeLocation ="LocalMachine"
                              storeName ="My"
                              x509FindType ="FindBySubjectName"
                              findValue ="localhost" />
        </serviceCredentials>
        <!--For debugging purposes set the includeExceptionDetailInFaults attribute to true-->
        <serviceDebug includeExceptionDetailInFaults="false" />
        <serviceMetadata httpGetEnabled="true"/>
      </behavior>
    </serviceBehaviors>
  </behaviors>
</system.serviceModel>

При запуске этого образца клиент вызывает различные операции службы от имени различных учетных записей пользователей: Alice, Bob и Charlie. Запросы и ответы операций появляются в окне консоли клиента. Все четыре вызова от имени пользователя Alice должны завершиться успешно. Пользователь Bob должен получить отказ в доступе при попытке вызвать метод Divide. Пользователь Charlie должен получить отказ в доступе при попытке вызвать метод Multiply. Чтобы закрыть клиент, нажмите клавишу ВВОД в окне клиента.

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

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

  2. Убедитесь, что вы настроили базу данных служб приложений ASP.NET.

    Примечание.

    Если используется выпуск SQL Server Express Edition, то сервер имеет имя .\SQLEXPRESS. Этот сервер следует использовать при настройке базы данных служб приложений ASP.NET, а также в строка подключения web.config.

    Примечание.

    Учетная запись рабочего процесса ASP.NET должна иметь разрешения на базу данных, созданную на этом шаге. Для этого воспользуйтесь служебной программой sqlcmd или средой SQL Server Management Studio.

  3. Чтобы запустить образец на одном или нескольких компьютерах, следуйте приведенным далее инструкциям.

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

  1. Убедитесь, что путь включает папку, в которой хранится файл Makecert.exe.

  2. Запустите Setup.bat из примера папки установки в командной строке разработчика для Visual Studio с правами администратора. Он устанавливает сертификаты службы, необходимые для запуска образца.

  3. Запустите программу Client.exe из каталога \client\bin. Действия клиента отображаются в консольном приложении клиента.

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

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

  1. Создайте каталог на компьютере службы. Создайте для этого каталога виртуальное приложение servicemodelsamples, с помощью средства управления службами IIS.

  2. Скопируйте файлы служебной программы из каталога «\inetpub\wwwroot\servicemodelsamples» в виртуальный каталог на компьютере службы. Убедитесь, что скопированы все файлы из подкаталога \bin. Кроме того, скопируйте на компьютер службы файлы Setup.bat, GetComputerName.vbs и Cleanup.bat.

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

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

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

  6. Измените web.config, чтобы отразить новое имя сертификата (в атрибуте findValue в <serviceCertificate>), которое совпадает с полным доменным именем компьютера.

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

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

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

  10. На клиентском компьютере из командной строки запустите программу 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.

Файл Setup.bat

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

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

  • Создание сертификата сервера.

    Следующие строки из файла Setup.bat создают используемый в дальнейшем сертификат сервера. Переменная %SERVER_NAME% задает имя сервера. Измените эту переменную, чтобы задать собственное имя сервера. По умолчанию в этом пакетном файле используется имя localhost.

    Сертификат хранится в хранилище «My store (Личном хранилище)» в расположении LocalMachine.

    echo ************
    echo Server cert setup starting
    echo %SERVER_NAME%
    echo ************
    echo making server cert
    echo ************
    makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=%SERVER_NAME% -sky exchange -pe
    
  • Установка сертификата сервера в хранилище доверенных сертификатов клиента.

    Следующие строки из файла Setup.bat копируют сертификат сервера в хранилище доверенных лиц клиента. Этот шаг является обязательным, поскольку сертификаты, созданные с помощью программы Makecert.exe, не получают неявного доверия со стороны клиентской системы. Если уже имеется сертификат, имеющий доверенный корневой сертификат клиента, например сертификат, выпущенный корпорацией Майкрософт, выполнять этот шаг по добавлению сертификата сервера в хранилище сертификатов клиента не требуется.

    certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople