Web サービスへのアクセス制御について数日前に投稿しました ( Web サービスへのアクセス制御)。つまり、ASP.NET Web サービスを//service/webserviceにデプロイしており、 //web1上の ASP.NET Web アプリケーション (app1)が証明書認証を使用して Web サービスにアクセスできるようにしたいと考えています。System.Net.WebException: The request failed with HTTP status 403: Forbidden exceptionが発生し続けます。以下は私のセットアップです:
証明書のエクスポートについて。
- //serviceに発行されたサーバー証明書を LocalMachine ストアからエクスポートし、service.cer として保存しました。
- また、LocalMachine ストアから//web1に発行されたクライアント証明書をエクスポートし、 web1.cer として保存しました。
//service/webserviceのセットアップ:
- ディレクトリ セキュリティで、匿名アクセスとすべての認証アクセス (統合 Windows アクセス、ダイジェスト認証、および基本認証) のチェックを外しました。
- セキュリティで保護された通信で、セキュリティで保護されたチャネル (SSL) が必要、128 ビットの暗号化が必要、クライアント証明書が必要、およびクライアント証明書マッピングを有効にするにチェックを入れました。次に、web1.cer を//service/webserviceへのアクセス権を持つAD アカウントMyDomain/userにマッピングしました。
- //service/webservice/WebService.asmxの場合、
<authentication mode="Windows" />
web.configで設定
//web1/app1でのセットアップ
<authentication mode="Windows" />
と<identity impersonate="true" />
web.config を設定- VS2008 では、//service/webservice/WebService.asmx への Web 参照を追加し、WServiceという名前を付けました。
- //web1/app1/default.aspx.csで、私はこれを持っていました:
using System.Security.Cryptography.X509Certificates;
using System.Net;
WService.WebService ws = new WService.WebService();
ServicePointManager.ServerCertificateValidationCallback = delegate(Object sender1, X509Certificate cert, X509Chain chain, System.Net.Security.SslPolicyErrors errors) { return true; };
//I was a bit confused here on which certificate I should use so I have tried both service.cer and web1.cer but still got the same error
X509Certificate x509 = X509Certificate.CreateFromCertFile(@"C:\Certificates\service.cer");
ws.ClientCertificates.Add(x509);
ws.DoSomething();
- WinHttpCertCfg.exe を実行して、ASPNET アカウントの LocalMachine の両方の証明書へのアクセスを許可しました
https://service/webservice/WebService.asmxにアクセスすると、クライアント証明書を提供するように求められました。しかし、https://web1/app1/default.aspx (Web サービスを呼び出す) にアクセスすると、HTTP ステータス 403 例外が発生します。
私は何を取りこぼしたか?問題は、//web1/app1/default.aspx.csが証明書の送信に失敗したためだと思います。それが問題なら、どうすればいいですか?VS 2008 と ASP.NET 3.5 で asmx と aspx の両方をビルドしました。