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


Поставщик управления членством и ролями

В примере поставщика членства и ролей показано, как служба может использовать 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="..." />
</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, что и атрибут findValue в элементе конфигурации <serviceCertificate>. Кроме того, поведение указывает, что проверка подлинности пар имени пользователя и паролей выполняется поставщиком членства 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: 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.

Файл 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