【发布时间】:2017-06-19 14:24:29
【问题描述】:
我有我的桌面应用程序。我想使用 C# 中的相互身份验证将发布请求发送到服务器 URL。我写了以下代码:--
System::Net::ServicePointManager::SecurityProtocol = SecurityProtocolType::Tls12;
WebRequestHandler ^ clientHandler = gcnew WebRequestHandler();
X509Certificates::X509Certificate2^ modCert = gcnew X509Certificates::X509Certificate2("Dev.pfx", "test");
clientHandler->ClientCertificates->Add(cerInter);
clientHandler->AuthenticationLevel = System::Net::Security::AuthenticationLevel::MutualAuthRequested;
clientHandler->ClientCertificateOptions = ClientCertificateOption::Manual;
httpClient = gcnew HttpClient(clientHandler);
HttpContent ^ httpContent = gcnew ByteArrayContent(state->postBody);
httpContent->Headers->ContentType = gcnew MediaTypeHeaderValue("application/octet-stream");
resultTask = httpClient->PostAsync(state->httpRequest, httpContent);
现在发布请求抛出异常,它是连接被远程主机强行关闭。我使用了wireshark,它显示客户端响应中的客户端证书长度为零。即使我没有在WebRequestHandler 中添加任何证书,我也会得到相同的响应。有人可以帮我解决这个问题或指导我寻找可能的解决方案。
编辑
大家好,我发现了问题。我必须在本地商店中设置客户端证书。
X509Certificates::X509Store store(X509Certificates::StoreName::Root, X509Certificates::StoreLocation::LocalMachine);
store.Open(X509Certificates::OpenFlags::ReadWrite);;
store.Add(cerInter);
但是,我面临的问题是,如果我不以管理员身份运行我的应用程序,则会引发访问权限异常。
如果我使用 StoreLocation::CurrentUser,它会弹出消息供批准。
有人可以建议,我如何在不提示消息的情况下将它与 StoreLocation::CurrentUser 一起使用?
除此之外,如果有人能提出建议,如果这是正确的方法,我将不胜感激?
【问题讨论】:
-
更多信息 - 我没有添加任何 web.config 文件。我不知道桌面应用程序是否需要它?
-
您示例中的代码是托管 C++,而不是 C#?
-
您好 Eric,感谢您的及时答复。是的,但我只在 C# 中使用过所有类。
-
我不确定你的意思。如果上面的托管 C++ 代码不是您遇到问题的代码,您可以分享您遇到问题的代码吗?
-
嗨,Eric,如果我让您感到困惑,我真的很抱歉....这是困扰我的托管 C++ 代码。我的想法是 HTTPclient 和 WebRequestHandler 都是 System.Net.HTTP 的一部分。因此,如果有人建议我用 C# 举一些例子,我可以很容易地用托管 C++ 编写相关代码...
标签: c# httpwebrequest dotnet-httpclient mutual-authentication