Прерывание "Удаленным сервером" была возвращена ошибка: (403) Запрещено "с помощью службы WCF в https
У меня есть служба WCF, из-за этой ошибки я свалился почти ничего. Это подталкивает меня к стене. Вот что у меня сейчас.
Очень простая служба WCF с одним методом, который возвращает строку со значением "test".
Очень простое веб-приложение, которое использует службу и помещает значение строки в метку.
Веб-сервер под управлением IIS 6 в Win 2003 с сертификатом SSL.
Другие службы WCF на том же сервере, который работает.
Я публикую для него службу WCF. https location
Я запускаю веб-приложение в режиме отладки в VS и отлично работает.
Я публикую в нем веб-приложение https на том же сервере, где служба WCF находится под тем же сертификатом SSL
Я получаю: "Удаленный сервер вернул ошибку: (403) Запрещено"
Я изменил почти все настройки в IIS, а также WCF и веб-приложения безрезультатно. Я сравнивал настройки в службах WCF, которые работают, и все одинаково.
Ниже приведены настройки в web.config для службы WCF и WEB-приложения:
Похоже, проблема связана с веб-приложением, но у меня нет идей. Любые идеи:
Служба WCF:
<system.serviceModel>
<bindings>
<client />
<services>
<service behaviorConfiguration="Ucf.Smtp.Wcf.SmtpServiceBehavior" name="Ucf.Smtp.Wcf.SmtpService">
<host>
<baseAddresses>
<add baseAddress="https://test.net.ucf.edu/webservices/Smtp/" />
</baseAddresses>
</host>
<endpoint address="" binding="wsHttpBinding" contract="Ucf.Smtp.Wcf.ISmtpService" bindingConfiguration="SSLBinding">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="Ucf.Smtp.Wcf.SmtpServiceBehavior">
<serviceMetadata httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" httpsHelpPageEnabled="True"/>
</behavior>
</serviceBehaviors>
</behaviors>
Веб-приложение:
<system.serviceModel>
<bindings><wsHttpBinding>
<binding name="WSHttpBinding_ISmtpService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text"
textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="Transport">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="Windows" negotiateServiceCredential="true"
establishSecurityContext="true" />
</security>
</binding>
<client>
<endpoint address="https://net228.net.ucf.edu/webservices/smtp/SmtpService.svc"
binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ISmtpService"
contract="SmtpService.ISmtpService" name="WSHttpBinding_ISmtpService">
<identity>
<dns value="localhost" />
</identity>
</client>
</system.serviceModel>
Ответы
Ответ 1
Я собираюсь ответить на свой вопрос, потратив часы и часы на эту проблему. Надеюсь, это поможет всем другим людям, которые били головой о стену, пытаясь понять это. Наконец, мы получили сетевого администратора и решили это.
Здесь сценарий и решение:
У нас есть производственный сервер - все работает нормально.
У нас есть тестовый сервер - мы получаем 403 запрещенную ошибку.
Отладка локально работает нормально.
Все настройки идентичны или так мы думали.
Есть одна настройка, которая была неправильной. В IIS в свойствах виртуального каталога веб-службы на вкладке "Безопасность каталога" вторая кнопка "Редактировать" предназначена для ограничений IP. У нас было настроено запретить доступ ко всем IP-адресам, за исключением списка, который должен был включать IP-адрес тестового сервера. IP-адрес тестового веб-сервера не был предоставлен. Причина, по которой у него не было прав, было то, что он был недавно клонирован с производственного виртуального сервера, и этот параметр никогда не был настроен для добавления тестового виртуального сервера.
Ответ 2
В моем случае я скопировал исходный код с другого компьютера, и виртуальный каталог здесь не был создан. как только я перешел к свойствам проекта и создал виртуальный каталог, он работал нормально.
Ответ 3
Единственное, что выпрыгивает на меня, - это передать идентификатор Windows с сообщением, это может вызвать проблему разрешений, если передаваемая учетная запись пользователя не имеет доступа к службе WCF. Потенциально нужна олицетворение в веб-приложении?
Ответ 4
По умолчанию привязки WCF не разрешают анонимный (без авторизации) доступ. Вам нужно изменить привязки, чтобы разрешить это:
<wsHttpBinding>
<binding ...>
<security mode ="None"/>
</binding>
</wsHttpBinding>
Ответ 5
В моем случае у моего пользователя apppool не было права на чтение\запись на "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Временные файлы ASP.NET" по какой-либо причине.
Ответ 6
Убедитесь, что у вас установлен compilation debug="true"
.