WCF и проверка подлинности Windows - PullRequest
2 голосов
/ 21 июня 2010

Я пытаюсь настроить службу WCF на нашем сервере, используя проверку подлинности Windows и IIS 7. При вызове службы я получаю следующее сообщение об ошибке.

Невозможно открыть базу данных "TestDB", запрошенную при входе в систему.Ошибка входаНе удалось войти в систему для пользователя 'NT AUTHORITY \ NETWORK SERVICE'.

Вот мой конфигурационный файл для службы WCF.

<?xml version="1.0"?>

<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->

<configuration>
    <system.web>
        <compilation debug="true" targetFramework="4.0" />
      <customErrors mode="Off"/>
      <authentication mode="Windows"/>
    </system.web>

    <system.serviceModel>
      <bindings>
        <basicHttpBinding>
          <binding name="binBulletin">
            <security mode="TransportCredentialOnly">
              <transport clientCredentialType="Windows" />
            </security>
          </binding>
        </basicHttpBinding>
      </bindings>
      <services>
        <service behaviorConfiguration="BulletinBoardService.BulletinBehavior"
          name="BulletinBoardService.BulletinService">
          <endpoint address="" binding="basicHttpBinding" bindingConfiguration="binBulletin"
            name="epBulletin_Basic" contract="BulletinBoardService.IBulletinService">
            <identity>
              <dns value="localhost" />
            </identity>
          </endpoint>
          <endpoint address="mex" binding="basicHttpBinding" bindingConfiguration="binBulletin"
            name="epBulletin_Mex" contract="IMetadataExchange" />
        </service>
      </services>
      <behaviors>
        <serviceBehaviors>
          <behavior name="BulletinBoardService.BulletinBehavior">
            <serviceMetadata httpGetEnabled="true" />
            <serviceDebug includeExceptionDetailInFaults="true" />
            <serviceAuthorization impersonateCallerForAllOperations="true" />
          </behavior>
        </serviceBehaviors>
      </behaviors>
      <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    </system.serviceModel>
    <system.webServer>
      <security>
        <authentication>
          <windowsAuthentication enabled="true"/>
        </authentication>
      </security>
    </system.webServer>
</configuration>

Любые советы приветствуются.

Ответы [ 2 ]

2 голосов
/ 05 октября 2011

Не знаю, поможет ли это кому-нибудь, но у меня была эта проблема. Проблема была связана с настройкой идентификатора пула приложений, который мой сервис использовал в IIS. Если вы установите соответствующую личность там, вы должны быть хорошими. В моем случае по умолчанию было установлено NT Authority \ Network Service.

1 голос
/ 21 июня 2010

Вы должны предоставить разрешение доступа в SQL Server для учетной записи NT AUTHORITY\NETWORK SERVICE, если вы используете локальный SQL Server или для DomainName\AspNetServer$ (где AspNetServer - это имя сервера, на котором работает IIS7).Подробности см., Например, в последнем разделе http://msdn.microsoft.com/en-us/library/ff647402.aspx.

UPDATED: Прежде всего не забудьте настроить виртуальный каталог IIS для включения «Аутентификации Windows» и отключения «Анонимной аутентификации».".

Я не уверен, что basicHttpBinding - лучший выбор для вас.Вы почти ничего не написали о своей службе WCF, поэтому я не могу порекомендовать вам способ.Посмотрите, например, http://msdn.microsoft.com/en-us/library/ms734769.aspx, какие способы вы можете выбрать.

Для доступа к локальной БД вы можете использовать олицетворение пользователя.Это может быть реализовано либо для каждого вызова WFC, либо вы можете выполнить временную олицетворение перед доступом к БД.(см., например, http://www.danrigsby.com/blog/index.php/2008/04/17/impersonate-a-clients-identity-in-wcf/).

Основная проблема заключается в том, что лучший способ для доступа к базе данных из службы отсутствует.Если вы выбираете олицетворение, например.Это может выглядеть красиво, потому что внутри базы данных видно, от какого пользователя пришел запрос.Но во многих реальных ситуациях использование подражания не действительно решает проблему, а только направляет ее.Кто должен управлять разрешением внутри базы данных?В отношении какого инструмента следует предоставлять разрешение пользователям.Кто занимается администрированием пользователей в вашей корпорации?У вас есть только одно администрирование пользователей в Active Directory или же администрирование баз данных SQL Server?Поэтому из-за существующих процессов в вашей корпорации олицетворение пользователя может быть не лучшим выбором.

Существует множество различных сценариев доступа к БД из WCF.Например, в последнем проекте, который я реализовал, я написал сервис WCF, в котором много методов.Внутри каждого метода непосредственно в начале метода я использовал API-интерфейс Microsoft Authorization Manager, чтобы проверить, есть ли у пользователя разрешение на соответствующую операцию или нет.Один из них использовал оснастку «Диспетчер авторизации», чтобы предоставить разрешение пользователю, назначив ему какую-то роль приложения.А для доступа к базе данных я использовал одну учетную запись пользователя (например, NT AUTHORITY\NETWORK SERVICE в вашем случае).Тем не менее, решение было безопасным, и у каждого был инструмент для администрирования пользователей, соответствующий бизнес-требованиям.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...