Как отключить ввод учетных данных для вызова HTTPS моего WCF, размещенного в службе Windows - PullRequest
0 голосов
/ 06 июня 2019

Я просто создаю свой первый проект WCF, поэтому у меня много недостатков в знаниях в этой области.Моя проблема в том, что когда я звоню по своей ссылке WCF в веб-браузере, мне нужно ввести учетные данные, но я даже не могу использовать свое доменное имя и пароль, но мне нужно выбрать свой личный сертификат чип-карты и ввести его пароль.После этого все работает как чудо.

Мой конечный продукт должен быть установлен на каждую пользовательскую рабочую станцию ​​в нашем домене только для целей ИТ-операций.Так что после этого будет авторизация AD.О сертификате ... У нас есть собственный сертификат корневого CA компании, и каждая рабочая станция имеет свой собственный сертификат, который является его внуком:

Пример нашего дерева сертификатов:

COMPANYROOTCA >> COMPANYSUBCA1 >> WORKSTATIONNAME.DOMAIN (этот используется в качестве сертификата службы WCF)

Это то, что у меня есть сейчас для размещения WCF в моей службе Windows, работающей под учетной записью NetworkService:

        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, но без указания учетных данных?

1 Ответ

3 голосов
/ 07 июня 2019

Я не видел, как вы используете учетные данные для аутентификации клиента.Тип учетных данных клиента двух конечных точек, которые вы используете для размещения службы, - Нет.Как браузер просит вас ввести учетные данные?Кроме того, по умолчанию, если сервер настроил ClientCredentialType для Windows, клиент будет использовать текущего пользователя в качестве учетных данных.Пароль и учетная запись текущего пользователя будут учетными данными по умолчанию, когда необходимо будет предоставить учетные данные.
Еще одна вещь, на которую следует обратить внимание, если в браузере вас просто попросят выбрать сертификат вместо учетных данных (пользователь / пароль), как показано ниже.,
enter image description here
Возможно, мы настроили следующий параметр ( 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 мы выполняем ее с помощью приведенного ниже пользовательского интерфейса.
enter image description here
И конфигурация параметров зависит от приведенного ниже.
enter image description here
enter image description here
Таким образом, я подозреваю, что процесс, который связывает сертификат с указанным портом, завершен IIS.и этот параметр следует игнорировать.
Не стесняйтесь, дайте мне знать, если есть что-то, с чем я могу помочь.

...