Озадачен "удаленный сервер вернул ошибку: (403) запрещено" с WCF сервисом в https
У меня есть служба WCF, которую я свел почти к нулю из-за этой ошибки. Это толкает меня вверх по стене. Вот что у меня теперь есть.
Очень простая служба WCF с одним методом, который возвращает строку со значением "test".
Очень простое веб-приложение, которое использует сервис и помещает значение строки в метку.
Веб-сервер под управлением IIS 6 на Win 2003 с сертификатом SSL.
Другие службы WCF на том же сервере, что и работа.
Я публикую службу WCF в ее расположении https
Я запускаю веб-приложение в режиме отладки в VS, и оно отлично работает.
Я публикую веб-приложение в его https-хранилище на том же сервере, на котором служба WCF находится под тем же SSL-сертификатом
Я получаю, "удаленный сервер вернул ошибку: (403) Forbidden"
Я изменил почти все настройки в IIS, а также WCF и веб-приложениях безрезультатно. Я сравнил настройки в службах WCF, которые работают и все то же самое.
Ниже приведены настройки в сети.конфигурация для службы WCF и веб-приложения:
Похоже, что проблема связана с веб-приложением, но у меня нет идей. Любые идеи:
Служба 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>
6 ответов:
Я собираюсь ответить на свой собственный вопрос после того, как потратил много часов на эту проблему. Я надеюсь, что это поможет всем другим людям, которые бьются головой о стену, пытаясь понять это. В конце концов мы привлекли администратора сети и решили эту проблему.
Вот сценарий и решение:
У нас есть рабочий сервер - все работает нормально. У нас есть тестовый сервер - мы получаем 403 запрещенную ошибку. Локальная отладка работает нормально.
Все настройки идентичны по крайней мере, мы так думали.
Есть одна установка, которая была неправильной. В IIS в свойствах виртуального каталога веб-сервиса на вкладке Безопасность каталога вторая кнопка редактирования предназначена для IP-ограничений. Наш был настроен на запрет доступа ко всем IP, за исключением списка, который должен был включать IP для тестового сервера. IP-адрес тестового веб-сервера не был предоставлен. Причина, по которой у него не было прав, заключалась в том, что он был недавно клонирован с рабочего виртуального сервера и это настройка никогда не изменялась для добавления тестового виртуального сервера.
В моем случае я скопировал исходный код с другой машины, и виртуальный каталог не был создан здесь. как только я зашел в свойства проекта и создал виртуальный каталог, он работал нормально.
Единственное, что бросается мне в глаза, это то, что вы передаете удостоверение windows с сообщением, Это может вызвать проблему с разрешениями, если передаваемая учетная запись пользователя не имеет доступа к службе WCF. Возможно, требуется олицетворение в веб-приложении?
По умолчанию привязки WCF не разрешают анонимный доступ (no-auth). Вам нужно изменить привязки, чтобы разрешить это:
<wsHttpBinding> <binding ...> <security mode ="None"/> </binding> </wsHttpBinding>
В моем случае мой пользователь apppool не имел доступа на чтение\запись к 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET файлы" по какой-то причине.
Comments