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