私はRESTFulサービスを確保するために取り組んでいます。windows認証を使用してカスタム認証マネージャーを登録する方法
すべてのクライアントは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>
私は匿名認証を無効にしました。すべてのクライアントを認証してから権限チェックを実行できるようにするため、これを行う必要があります。私はWindows認証(NTLM?)も有効にしました。
私が持っている最初の問題は、私は、ブラウザからこれをテストするとき、私は次のエラーメッセージが表示されますです:
このサービスのセキュリティ設定が「匿名」認証を必要とするが、それはIISのアプリケーションが使用できないため、このサービスをホストしています。
私はanon認証を有効にしたくないので、私が無効にしているという事実とは明らかに異なるAnon認証を示している設定がいくつかあるようです。 Anon認証が許可されないように指定する必要があるのはどこですか? (さまざまな記事によればこの問題の原因となる可能性のあるmexエンドポイントは使用していないことがわかります)
次の問題は、カスタム認証マネージャーを登録しようとしていることです。その理由は、ユーザーがどのグループに属しているかを確認し、そのグループに基づいて権限の決定を行うためです。たとえば、ユーザーが 'ReadOnly'という名前のグループのメンバーである場合、そのユーザーはサービス上でgetメソッドを呼び出すことしかできません。クライアントがグループ 'ReadAndWrite'のメンバーである場合、クライアントはサービスのputメソッドも呼び出すことができます。
私は(ServiceauthorisationManagerから派生した)認可クラスを登録しようとしています。これはRESTAuthorisationBehaviourビヘイビア内で表現されます。私はこのクラスにいくつかのログを記録しましたが、これはログには表示されないので、正しく登録されていません。
最後の問題は偽装です。これをテストするために、サービスコードの中で、WindowIdentityにアクセスしてログに表示しています。私が見つけているのは、ユーザ名が私が必要とするエンドユーザを表していないことで、これまでに説明した権限チェックを実行できることです。代わりに私が見ているのは、ユーザーがアプリケーションプールID( 'IIS APPPOOL \ SecureREST')です。これは私には役に立たない。私は偽装フラグをオンにしています(configから見ることができます)が、実際のクライアントの資格情報がWindowsIdentityオブジェクトに表示されるようにするにはどうすればよいですか?次のように私は、Windowsのアイデンティティのホールドを取得するために使用しているコードは次のとおりです。
WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent();
string accountName = windowsIdentity.Name;
私も無駄にwindowsIndentityオブジェクトの偽装メソッドを呼び出して試してみました。
認証されたユーザーを偽装するにはどうすればよいですか?
匿名認証の例外に関して