2

我几天前发布了关于 Web 服务的访问控制(Web 服务的访问控制)。简而言之,我在//service/webservice上部署了一个 ASP.NET Web 服务,我希望//web1上的 ASP.NET Web 应用程序 (app1)能够通过证书身份验证访问 Web 服务。我不断收到System.Net.WebException: The request failed with HTTP status 403: Forbidden exception。以下是我的设置:

关于证书出口;

  • 我从 LocalMachine 商店导出了颁发给//service的服务器证书并将其保存为 service.cer。
  • 我还从 LocalMachine 商店导出了颁发给//web1的客户端证书并将其保存为 web1.cer

//service/webservice上设置:

  • 在目录安全上,未选中匿名访问和所有身份验证访问(集成 Windows 访问、摘要式身份验证和基本身份验证)。
  • 在安全通信上,选中所需的安全通道 (SSL)、需要 128 位加密、需要客户端证书和启用客户端证书映射。然后,我将 web1.cer 映射到一个 AD 帐户MyDomain/user,该帐户有权访问//service/webservice
  • 对于//service/webservice/WebService.asmx<authentication mode="Windows" />在 web.config 上设置

//web1/app1上的设置

  • 在 web.config 上设置<authentication mode="Windows" /><identity impersonate="true" />
  • 在 VS2008 中,我将 web 引用添加到//service/webservice/WebService.asmx并将其命名为 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 以授予对 LocalMachine for ASPNET 帐户中两个证书的访问权限

我去了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。

4

4 回答 4

2

确保您的客户端证书被请求为“客户端身份验证”的“计算机”模板证书,否则它将不起作用。

于 2009-04-23T18:54:03.450 回答
2

听起来 SSL 证书无法对 Web 服务客户端进行身份验证。一个很好的检查是,如果您从客户端计算机访问服务并在浏览器中收到有关 SSL 证书的警报,您的服务将不会使用证书进行身份验证(证书不受信任)。不是证书不起作用,只是不可信。

如果服务是跨机器的,您可能必须设置证书颁发机构(这可能有助于http://www.petri.co.il/install_windows_server_2003_ca.htm)并将其添加为客户端计算机上的受信任发布者。这也可能有助于http://support.microsoft.com/kb/901183

另一种选择是简单地不验证 SSL,请参阅: http: //geekswithblogs.net/jwhitehorn/archive/2006/09/20/91657.aspx

于 2009-01-04T00:54:21.673 回答
1

当我遇到这个问题时,原来我使用的客户端证书/密钥对是由当前用户存储而不是本地机器存储中的中间 CA 签名的。如果您在登录时检查了证书,但 IIS 工作进程看不到中间 CA,这一切看起来都很好。因此,Web 服务调用未随请求提供证书。您可以通过检查服务器 Web 日志的403 7 5响应来验证这一点。

于 2014-04-25T13:17:03.063 回答
0

确保模拟的用户有权访问正在使用的证书存储。

于 2011-09-18T23:03:18.543 回答