Как использовать проверку подлинности Windows и зарегистрировать пользовательский менеджер авторизации - PullRequest
1 голос
/ 01 августа 2011

Я работаю над защитой службы 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», он также может вызывать методы put для службы.

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

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

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

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

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

1 Ответ

0 голосов
/ 09 января 2013

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

    <behavior name="MyServiceBehavior">
      <serviceMetadata httpGetEnabled="false" />
    </behavior>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...