如何禁用对 windows 服务中托管的 WCF 的 HTTPS 调用的凭据输入
How to disable credentials input for HTTPS call to my WCF hosted in windows service
我刚刚创建我的第一个 WCF 项目,所以我在这方面的知识有很多不足。我的问题是,当我在 Web 浏览器中调用我的 WCF url 时,我必须输入凭据,但我什至不能使用我的域名和密码,但我必须选择我的个人芯片卡证书并输入它密码。在那之后,一切都很顺利。
我的最终产品应该安装在我们域中的每个用户工作站上,仅用于 IT 操作目的。所以之后会有一些AD授权。
关于证书...我们有自己的公司根 CA 证书,每个工作站都有自己的证书,这是它的孙子:
我们的证书树示例:
COMPANYROOTCA >> COMPANYSUBCA1 >> WORKSTATIONNAME.DOMAIN(这个用作 WCF 服务证书)
这就是我现在在网络服务帐户下的 Windows 服务 运行 中托管 WCF 的内容:
serviceHost.Dispose(); //extension for close() and set to null
Uri httpsUrl = new Uri("baseAdress");
serviceHost = new ServiceHost(typeof(Service.myService), httpsUrl);
WSHttpBinding wsHttpBinding = new WSHttpBinding();
wsHttpBinding.Security.Mode = SecurityMode.Transport;
wsHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
wsHttpBinding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None;
WebHttpBinding webHttpBinding = new WebHttpBinding();
webHttpBinding.Security.Mode = WebHttpSecurityMode.Transport;
webHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
webHttpBinding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None;
ServiceMetadataBehavior smb = new ServiceMetadataBehavior
{
HttpGetEnabled = false,
HttpsGetEnabled = true,
};
X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
X509Certificate2Collection collection = store.Certificates;
X509Certificate2 cert = collection.OfType<X509Certificate2>().First(c => c.SubjectName.Name == "CN=WorkstationName.Domain");
store.Close();
serviceHost.Credentials.ServiceCertificate.Certificate = cert;
ServiceThrottlingBehavior throttleBehavior = new ServiceThrottlingBehavior
{
MaxConcurrentCalls = 16,
MaxConcurrentInstances = 26,
MaxConcurrentSessions = 10
};
serviceHost.Description.Behaviors.Add(throttleBehavior);
ServiceEndpoint soapEndpoint = serviceHost.AddServiceEndpoint(typeof(Contract.IMyService), wsHttpBinding, "soap");
ServiceEndpoint restEndpoint = serviceHost.AddServiceEndpoint(typeof(Contract.IMyService), webHttpBinding, "rest");
ServiceEndpoint mexEndpoint = serviceHost.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpsBinding(), "mex");
restEndpoint.Behaviors.Add(new WebHttpBehavior());
tempAdminHost.Open();
所以我的问题是:有没有办法,例如如何自动获取使用浏览器的域帐户并调用 url 或任何替代方法如何在不输入任何凭据的情况下仍然使用 HTTPS?
我没有看到您使用凭据对客户端进行身份验证的方式。您用于托管服务的两个端点的客户端凭据类型是 None。浏览器如何要求您输入凭据?此外,默认情况下,如果服务器将 ClientCredentialType 设置为 Windows,则客户端将使用当前用户作为凭据。需要提供凭据时,将当前用户的密码和帐号作为默认凭据。
还有一点要注意,如果只是在浏览器中提示你select一个证书而不是credential(user/password),如下,
我们可能配置了以下参数(clientcertnegotiation参数).
netsh http add sslcert ipport=127.0.0.1:8000 certhash=c20ed305ea705cc4e36b317af6ce35dc03cfb83d appid={c9670020-5288-47ea-70b3-5a13da258012} clientcertnegotiation=enable
因为您提供证书来加密通信的方式不正确。
serviceHost.Credentials.ServiceCertificate.Certificate = cert;
我们需要将证书绑定到端口
https://docs.microsoft.com/en-us/windows/desktop/http/add-sslcert
在 IIS 中托管服务时,我们通过以下 UI 来完成它。
而参数配置依赖于下面
所以我怀疑将证书绑定到指定端口的过程是由IIS完成的。并且参数应该被忽略。
如果有什么我可以帮忙的,请随时告诉我。
我刚刚创建我的第一个 WCF 项目,所以我在这方面的知识有很多不足。我的问题是,当我在 Web 浏览器中调用我的 WCF url 时,我必须输入凭据,但我什至不能使用我的域名和密码,但我必须选择我的个人芯片卡证书并输入它密码。在那之后,一切都很顺利。
我的最终产品应该安装在我们域中的每个用户工作站上,仅用于 IT 操作目的。所以之后会有一些AD授权。 关于证书...我们有自己的公司根 CA 证书,每个工作站都有自己的证书,这是它的孙子:
我们的证书树示例:
COMPANYROOTCA >> COMPANYSUBCA1 >> WORKSTATIONNAME.DOMAIN(这个用作 WCF 服务证书)
这就是我现在在网络服务帐户下的 Windows 服务 运行 中托管 WCF 的内容:
serviceHost.Dispose(); //extension for close() and set to null
Uri httpsUrl = new Uri("baseAdress");
serviceHost = new ServiceHost(typeof(Service.myService), httpsUrl);
WSHttpBinding wsHttpBinding = new WSHttpBinding();
wsHttpBinding.Security.Mode = SecurityMode.Transport;
wsHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
wsHttpBinding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None;
WebHttpBinding webHttpBinding = new WebHttpBinding();
webHttpBinding.Security.Mode = WebHttpSecurityMode.Transport;
webHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
webHttpBinding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None;
ServiceMetadataBehavior smb = new ServiceMetadataBehavior
{
HttpGetEnabled = false,
HttpsGetEnabled = true,
};
X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
X509Certificate2Collection collection = store.Certificates;
X509Certificate2 cert = collection.OfType<X509Certificate2>().First(c => c.SubjectName.Name == "CN=WorkstationName.Domain");
store.Close();
serviceHost.Credentials.ServiceCertificate.Certificate = cert;
ServiceThrottlingBehavior throttleBehavior = new ServiceThrottlingBehavior
{
MaxConcurrentCalls = 16,
MaxConcurrentInstances = 26,
MaxConcurrentSessions = 10
};
serviceHost.Description.Behaviors.Add(throttleBehavior);
ServiceEndpoint soapEndpoint = serviceHost.AddServiceEndpoint(typeof(Contract.IMyService), wsHttpBinding, "soap");
ServiceEndpoint restEndpoint = serviceHost.AddServiceEndpoint(typeof(Contract.IMyService), webHttpBinding, "rest");
ServiceEndpoint mexEndpoint = serviceHost.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpsBinding(), "mex");
restEndpoint.Behaviors.Add(new WebHttpBehavior());
tempAdminHost.Open();
所以我的问题是:有没有办法,例如如何自动获取使用浏览器的域帐户并调用 url 或任何替代方法如何在不输入任何凭据的情况下仍然使用 HTTPS?
我没有看到您使用凭据对客户端进行身份验证的方式。您用于托管服务的两个端点的客户端凭据类型是 None。浏览器如何要求您输入凭据?此外,默认情况下,如果服务器将 ClientCredentialType 设置为 Windows,则客户端将使用当前用户作为凭据。需要提供凭据时,将当前用户的密码和帐号作为默认凭据。
还有一点要注意,如果只是在浏览器中提示你select一个证书而不是credential(user/password),如下,
我们可能配置了以下参数(clientcertnegotiation参数).
netsh http add sslcert ipport=127.0.0.1:8000 certhash=c20ed305ea705cc4e36b317af6ce35dc03cfb83d appid={c9670020-5288-47ea-70b3-5a13da258012} clientcertnegotiation=enable
因为您提供证书来加密通信的方式不正确。
serviceHost.Credentials.ServiceCertificate.Certificate = cert;
我们需要将证书绑定到端口
https://docs.microsoft.com/en-us/windows/desktop/http/add-sslcert
在 IIS 中托管服务时,我们通过以下 UI 来完成它。
而参数配置依赖于下面
所以我怀疑将证书绑定到指定端口的过程是由IIS完成的。并且参数应该被忽略。
如果有什么我可以帮忙的,请随时告诉我。