Я работаю над обеспечением безопасности службы 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, но безрезультатно.
Итак, как мне выдать себя за аутентифицированного пользователя?