如何禁用对 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完成的。并且参数应该被忽略。
如果有什么我可以帮忙的,请随时告诉我。