我有一个基于WebHttpBinding的自托管WCF REST服务。该服务的方法之一看起来像这样:
[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "myMethod")]
Stream MyMethod(Stream contents);
我编写了一个简单的测试程序,它创建了一个HttpWebRequest来尝试将POST数据发送到这个方法。这在以下情况下工作正常:
如果我尝试使用带有客户端证书的传输安全性超过0字节的POST,该服务将返回HTTP 403(禁止),并且它永远不会访问我的任何代码。
这让我疯了。
有什么想法吗?
更新
启用http.sys跟踪后,我在跟踪中观察到以下消息:
服务器应用程序尝试接收客户端证书失败,状态为:0xC0000225。
有谁知道这意味着什么?我确定我正在发送客户端证书,并确定它已被主机信任。
答案 0 :(得分:0)
您可能需要为本地主机设置SSL证书。
1)运行 - > “MMC”
2)文件 - >添加/删除管理单元...
3)在“可用的管理单元”下,选择“证书”和“添加>”
4)选择“计算机帐户”
5)点击“下一步”
6)点击“完成”
7)点击“确定”
8)查看个人 - >证书我认为你应该有一个127.0.0.1
9)单击该证书并将其拖动到“受信任的根证书颁发机构”
然后,无论您使用何种地址,都需要将该URL更改为127.0.0.1(而不是localhost),因为这不起作用。证书应该是有效的,我认为你将能够获得过去的授权。
如果您遇到其他问题,那么可能不是您的证书,因此请确保您的服务,行为和绑定准确无误。
一种帮助您使用WCF跟踪查看之后可能出现的问题的方法,我将无耻地指向您的博客文章。 :)
祝你好运。答案 1 :(得分:0)
您需要在客户端和服务器中启用安全性
在服务器上,在Web配置中,您应该设置安全绑定:TRANSPORT和CERTIFICATE
在客户端创建HttpWebRequest时,还必须启用TRANSPORT和CERTIFICATE。您还应该以编程方式分配客户端证书。
应打开SSL端口(443) - 通过telnet检查。
有时IIS会禁用POST动词。你必须启用它
如果您需要更多详细信息或有问题发布一些代码和web.config文件。
答案 2 :(得分:0)
经过长时间的痛苦搜索,我终于发现问题是一个腐败的客户证书。虽然没有外部指示,但此证书的私钥未保存在本地计算机上。我们在代码中生成证书,然后将其导入当前用户的个人存储区。但是,我们没有在用于生成私钥的对象上设置RSACryptoServiceProvider.PersistKeyInCsp属性。因此,.NET删除了私钥容器,导入的证书最终引用了一个不存在的私钥。
对这篇文章的回复重点介绍了使用.NET导入证书的问题:Inserting certificate with private key。