我刚刚创建了我的第一个WCF项目,所以我在这一领域的知识上有很多不足。我的问题是,当我在Web浏览器中调用WCF URL时,我必须输入凭据,但我什至不能使用域名和密码,但必须选择个人芯片卡证书并输入其密码。之后,一切都像魅力一样。
我的最终产品应仅安装在我们域中的每个用户工作站上,仅用于IT操作。因此,此后会有一些AD授权。 关于证书...我们有自己的公司根CA证书,每个工作站都有自己的证书,即孙子:
我们的证书树示例:
COMPANYROOTCA >> COMPANYSUBCA1 >> WORKSTATIONNAME.DOMAIN(此文件用作WCF服务证书)
这是我现在要在NetworkService帐户下运行的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但不放置任何其他方法凭据?
答案 0 :(得分:3)
我没有看到您使用凭据对客户端进行身份验证的方式。用于承载服务的两个端点的客户端凭据类型为“无”。浏览器如何要求您输入凭证?此外,默认情况下,如果服务器将ClientCredentialType设置为Windows,则客户端将使用当前用户作为凭据。需要提供凭据时,当前用户的密码和帐户将是默认凭据。
还有一点要注意,如果仅在浏览器中提示您选择证书而不是凭据(用户/密码),如下所示,
我们可能已经配置了以下参数( 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完成的。并应忽略该参数。
随时让我知道是否有什么可以帮助您的。