これらの資格情報オブジェクトがどのように機能するかを理解するのに苦労しています。実際、期待どおりに動作しない可能性があります。今回の問題の解説です。
Web サービスを介して相互に通信する必要がある 2 つのサーバーがあります。最初のもの ( と呼びましょうServer01
) には、NetworkService アカウントとして実行されている Windows サービスがあります。もう 1 つのServer02
サーバーには、IIS 6.0 で実行されている ReportingServices があります。Windows サービスServer01
は、ReportingServices WebService を使用してServer02
レポートを生成し、電子メールで送信しようとしています。
というわけで、これまでに試したことは次のとおりです。
実行時に資格情報を設定します (これは完全に正常に動作します):
rs.Credentials = new NetworkCredentials("user", "pass", "domain");
ここで、汎用ユーザーを使用できれば問題ありませんが、許可されていません。そのため、DefaultCredentials または DefaultNetworkCredentials を使用して RS Web サービスに渡します。
rs.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials
または:
rs.Credentials = System.Net.CredentialCache.DefaultCredentials
どちらにしてもうまくいきません。IIS から常に 401 Unauthorized が返されます。ここでわかっていることは、NetworkService としてログに記録されたリソースへのアクセスを許可したい場合は、それをDOMAIN\MachineName$
( http://msdn.microsoft.com/en-us/library/ms998320.aspx ) に付与する必要があるということです。
リモート SQL Server へのアクセス権の付与
同じドメイン (または信頼されたドメイン) 内の別のサーバー上のデータベースにアクセスしている場合、ネットワーク サービス アカウントのネットワーク資格情報を使用して、データベースに対する認証が行われます。ネットワーク サービス アカウントの資格情報は、DomainName\AspNetServer$ の形式です。ここで、DomainName は ASP.NET サーバーのドメイン、AspNetServer は Web サーバー名です。
たとえば、ASP.NET アプリケーションがドメイン CONTOSO 内の SVR1 という名前のサーバーで実行されている場合、SQL Server は CONTOSO\SVR1$ からのデータベース アクセス要求を認識します。
IIS と同じ方法でアクセスを許可するとうまくいくと想定しました。ただし、そうではありません。または、少なくとも、正しく認証するために何かが正しく設定されていません。
それで、ここにいくつかの質問があります:
「Impersonating Users」についてどこかで読みましたが、これをWindows Serviceのどこかに設定する必要がありますか?
NetworkService ビルトイン アカウントへのアクセスをリモート IIS サーバーに許可することはできますか?
読んでくれてありがとう!