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

Я работаю над обеспечением безопасности службы RESTFul.

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

<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
    <authentication mode="Windows" />
    <identity impersonate="true" />
  </system.web>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </modules>
  </system.webServer>
  <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
    <protocolMapping>
      <add scheme="http" binding="webHttpBinding" />
    </protocolMapping>
    <services>
      <service name ="SecureREST" behaviorConfiguration="RESTAuthorisationBehaviour">
        <endpoint address="" binding="webHttpBinding" bindingConfiguration="default" contract="Service.ISecureService">
        </endpoint>
      </service>
    </services>
    <bindings>
      <basicHttpBinding>
        <binding name="default">
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Ntlm" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="RESTAuthorisationBehaviour">
          <serviceAuthorization serviceAuthorizationManagerType="Security.RESTAuthorisationManager"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

В IIS я отключил анонимную аутентификацию. Мне нужно это сделать, поскольку мы хотим, чтобы все клиенты прошли аутентификацию, чтобы затем мы могли выполнять проверки авторизации. Я также включил проверку подлинности Windows (NTLM?).

Первая проблема, с которой я сталкиваюсь, - когда я тестирую это в браузере, я получаю следующее сообщение об ошибке:

Параметры безопасности для этой службы требуют «анонимной» аутентификации, но она не включена для приложения IIS, в котором размещена эта служба.

Я не хочу включать анонимную аутентификацию, поэтому похоже, что где-то еще есть какая-то конфигурация, которая указывает на анонимную аутентификацию, что явно противоречит тому факту, что я ее отключил. Где еще мне нужно указать, что аутентификация Anon не разрешена? (Вы также увидите, что я не использовал конечные точки mex, которые, согласно различным статьям, могут быть причиной этой проблемы).

Следующая проблема, с которой я столкнулся, заключается в том, что я пытаюсь зарегистрировать собственный диспетчер авторизации. Причина в том, что я хочу проверить, членом каких групп является пользователь, и на основании этого принять решение об авторизации. Например, если пользователь является членом группы с именем ReadOnly, он может вызывать только метод get в службе. Если клиент является членом группы ReadAndWrite, он также может вызывать методы размещения в службе.

Вы должны увидеть, что я попытался зарегистрировать класс авторизации (производный от ServiceauthorisationManager); это выражается в поведении RESTAuthorisationBehaviour. Я ввел некоторый вход в этот класс, но ничего из этого не отображается в журналах, поэтому я знаю, что он не зарегистрирован должным образом.

Последний вопрос - олицетворение. Чтобы проверить это, внутри служебного кода я обращаюсь к WindowIdentity и отображаю его в журналах. Я обнаружил, что имя пользователя не представляет конечного пользователя, что мне и нужно, поэтому я могу выполнить ранее описанные проверки авторизации. Вместо этого я вижу, что пользователь является удостоверением пула приложений ('IIS APPPOOL \ SecureREST'). Мне это ни к чему. Я включил флаг олицетворения (как видно из конфигурации), но как заставить его работать, чтобы учетные данные реальных клиентов были представлены в объекте WindowsIdentity? Код, который я использую для получения идентификатора Windows, выглядит следующим образом:

WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent();
string accountName = windowsIdentity.Name;

Я также попытался вызвать метод Impersonate для объекта windowsIndentity, но безрезультатно.

Итак, как мне выдать себя за аутентифицированного пользователя?


person Plastikfan    schedule 01.08.2011    source источник


Ответы (1)


Что касается исключения об анонимной аутентификации, попробуйте отключить метаданные http get в поведении вашей службы следующим образом:

    <behavior name="MyServiceBehavior">
      <serviceMetadata httpGetEnabled="false" />
    </behavior>
person Lee Dale    schedule 09.01.2013