WebServiceHost не работает после отключения анонимной аутентификации в IIS - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть служба wcf отдыха, интегрированная с asp. net и развернутая в IIS. Это работает нормально, когда включена анонимная аутентификация. Когда он отключен, он выдает ошибку 401, когда я использую остальные API-вызов в почтальоне. В IIS включена анонимная проверка подлинности и проверка подлинности с помощью форм. Теперь я отключил Anonymous и Forms и включил только windows аутентификацию. Мой код ниже:

public class SampleWebServiceHostFactory : WebServiceHostFactory
    {
        private Type ContractServiceType;
        private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

        public SampleWebServiceHostFactory(Type contractServiceType):base()
        {            
            ContractServiceType = contractServiceType;
        }

        protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
        {            
            WebServiceHost host = (WebServiceHost)base.CreateServiceHost(serviceType,baseAddresses);


            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            WebHttpBinding mybinding = new WebHttpBinding(WebHttpSecurityMode.Transport);
            mybinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;

            mybinding.MaxReceivedMessageSize = 2147483647;
            mybinding.TransferMode = TransferMode.StreamedRequest;
            mybinding.ReaderQuotas.MaxDepth = 1204;
            mybinding.ReaderQuotas.MaxStringContentLength = 2147483647;
            mybinding.ReaderQuotas.MaxArrayLength = 2147483647;
            mybinding.ReaderQuotas.MaxBytesPerRead = 2147483647;
            mybinding.ReaderQuotas.MaxNameTableCharCount = 2147483647;
            mybinding.SendTimeout = new TimeSpan(4,0,0);
            mybinding.ReceiveTimeout = new TimeSpan(4,0,0);

            host.AddServiceEndpoint(ContractServiceType, mybinding, "");
            host.Description.Behaviors.Add(new RestServiceBehavior());
            log.Info("Testing1");
            return host;
        }
    }

код ниже в файле конфигурации

<system.serviceModel>
    <client/>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="false" httpsGetEnabled="false"/>
          <serviceDebug httpHelpPageEnabled="false" httpsHelpPageEnabled="false" includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <webHttpBinding>
        <binding receiveTimeout="00:10:00" sendTimeout="00:10:00" maxReceivedMessageSize="2147483647">
          <readerQuotas maxDepth="64" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
        </binding>
      </webHttpBinding>
    </bindings>
  </system.serviceModel>

Я включил вход в Global.asax, чтобы увидеть, где возникает проблема. После запуска метода Session_Start я вижу строку журнала «Testing1» в приведенном выше коде. После этого не регистрировался, и он выдавал ошибку 401 в почтальоне и продолжал запрашивать имя пользователя и пароль, когда я использую URL в браузере.

1 Ответ

0 голосов
/ 20 апреля 2020

Теперь, когда мы уже настроили конфигурацию в конструкторе WebServiceHostFactory, нет необходимости настраивать ее отдельно в файле конфигурации.

      <webHttpBinding>
    <binding receiveTimeout="00:10:00" sendTimeout="00:10:00" maxReceivedMessageSize="2147483647">
      <readerQuotas maxDepth="64" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
    </binding>
  </webHttpBinding>

Я предлагаю вам обратиться к приведенной ниже конфигурации для Windows Аутентификация.

  <system.serviceModel>
    <services>
      <service name="WcfService3.Service1">
        <endpoint address="" behaviorConfiguration="rest" contract="WcfService3.IService1" binding="webHttpBinding" bindingConfiguration="https"></endpoint>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    <endpointBehaviors>
      <behavior name="rest">
        <webHttp helpEnabled="true"/>
      </behavior>
    </endpointBehaviors>
    </behaviors>
    <bindings>
      <webHttpBinding>
        <binding name="https">
          <security mode="Transport">
            <transport clientCredentialType="Windows">
            </transport>
          </security>
        </binding>
      </webHttpBinding>
    </bindings>
  </system.serviceModel>

После этого отключите другие режимы аутентификации в IIS. Мы должны предоставить пару windows учетных данных при вызове службы.
enter image description here
На самом деле учетные данные - это учетная запись windows на стороне сервера, что позволяет нам доступ к веб-сайту.
Не стесняйтесь, дайте мне знать, если проблема все еще существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...