WCF на IIS 7.0 Проблема конфигурации безопасности службы с использованием базовой аутентификации - PullRequest
1 голос
/ 27 марта 2012

Последние пару дней я пытался решить проблему при размещении службы WCF в SQL 2008 Server и IIS 7.0.

Эта проблема возникает, только если у меня отключена анонимная аутентификация и я использую обычную аутентификацию по SSL, как показано в приведенном ниже фрагменте web.config

<security mode="Transport">
    <transport clientCredentialType="Basic" />
</security>

Обычно, когда я пытаюсь получить доступ к файлу MeterReadingService.svc, я получаю сообщение об ошибке IIS о том, что не удается найти ресурс \ Account \ Login. Кажется, меня перенаправляют на страницу входа. Проверка подлинности с помощью форм не включена в IIS

Сведения об ошибке:

Ошибка HTTP 404.0 - Не найдено Ресурс, который вы ищете, был удален, изменилось его имя или временно недоступен.

Подробная информация об ошибках Модуль IIS Web Core Карта уведомленийRequestHandler Обработчик StaticFile Код ошибки 0x80070002 Запрошенный URL https://localhost:9011/FrontEndWS/Account/Login?ReturnUrl=%2fFrontEndWS%2fMeterReadingService.svc

Физический путь D: \ WebApplications \ MeterReaderPortal \ FrontEndWS \ Account \ Login Базовый метод входа Администратор пользователя входа в систему

Можете ли вы указать какие-либо указатели, почему это происходит, или как я могу записать причину этой ошибки?

Ответы [ 3 ]

1 голос
/ 16 апреля 2012

Что authentication mode вы настроили в system.web в вашем файле web.config?

Исходя из сообщения об ошибке, я буду считать, что это Forms.

Чтобы использовать обычную аутентификацию с паролями Windows, System.Web.Authentication должен выглядеть следующим образом:

<system.web>
  <authentication mode="Windows" />
</system.web>

.. и binding.security вот так:

<security mode="Transport">
  <transport clientCredentialType="Basic" />
</security>
0 голосов
/ 31 октября 2012

Я не знаю, что

<authentication mode="Windows" /> does. 

Я только что добавил его туда. Я не знаю, правильно ли это делать или нет. Как я уже заметил; Что я хочу сделать, так это защитить свой wcf по имени пользователя и паролю, чтобы любой (создавший где-либо, в Интернете), кто хочет позвонить по моему wcf, должен предоставить имя пользователя / пароль и мою проверку кода wcf, если они существуют (например, в AD) и аутентифицируется соответственно. Я не знаю, какой тип привязки использовать при использовании wshttpbinding, webhttpbinding или basichttpbinding. В классе CustomAuthorizationManager, который вы видите в файле конфигурации, у меня есть метод переопределения с именем

protected override bool CheckAccessCore(OperationContext operationContext)
    {
        //Extract the Authorization header, and parse out the credentials converting the Base64 string:
        var authHeader = WebOperationContext.Current.IncomingRequest.Headers["Authorization"];
        if ((authHeader != null) && (authHeader != string.Empty))
        {                                                      

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

0 голосов
/ 31 октября 2012

Я хочу, чтобы клиент (который является сайтом asp.net) вызывал wcf.Оба размещены в IIS7 на моем ноутбуке.Для WCF я включил базовую аутентификацию в IIS7 и отключил все остальные.Для клиента я включил базовую аутентификацию и отключил все остальные параметры аутентификации.

Проблема в том, что с этими конфигами ниже клиент не получает никаких данных от wcf.

Если яв браузере перейдите к сервису, указав URL-адрес сервиса, затем я должен ввести имя пользователя / пароль в всплывающей форме.

Что я хочу сделать, так это защитить свой wcf по имени пользователя и паролю, чтобычто любой, кто хочет вызвать мой wcf, должен предоставить имя пользователя / пароль и мой код wcf, чтобы проверить, существуют ли они (например, в AD) и, соответственно, аутентифицируются.

мой клиент (простой веб-сайт ASP.net, вызывающийWCF) web.config:

<configuration>
<appSettings>
<add key="userName" value="Administrator"/>
<add key="password" value="pass"/>
<!--<add key="url" value="http://localhost:57895/ListData.svc"/>-->
<!--http://localhost/WCF/-->    
<add key="url" value="http://localhost:8082/ListData.svc"/>
</appSettings>
<system.web>
  <compilation debug="true" targetFramework="4.0" />
</system.web>
<system.webServer>
  <directoryBrowse enabled="true"/>
</system.webServer>
</configuration>

Мой сервис WCF web.config:

<?xml version="1.0"?>
<configuration>
<appSettings>
<add key="Logging" value="true"/>
</appSettings>
<connectionStrings/>
<system.web>
<authentication mode="Windows"></authentication>
<compilation debug="true" />
<pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/>
</system.web>
<system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding name="httpBinding">
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Basic" />
      </security>
    </binding>
  </basicHttpBinding>
  <!--<webHttpBinding>
    <binding name="webHttpTransportSecurity">
      <security mode="Transport">
        <transport clientCredentialType="Basic"/>
      </security>
    </binding>
  </webHttpBinding>-->
</bindings>
<services>
  <service behaviorConfiguration="SecureRESTSvcTestBehavior" name="Hdir.ListData">
    <!--<host>
      <baseAddresses>
        <add baseAddress="http://localhost:57895/ListData/"/>
      </baseAddresses>
    </host>-->
    <!--webHttpBinding allows exposing service methods in a RESTful manner-->
    <endpoint address="" binding="basicHttpBinding" bindingConfiguration="httpBinding"      behaviorConfiguration="webHttpBehavior" contract="Hdir.IListData"/>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <!--<behavior name=" ">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>-->
    <behavior name="SecureRESTSvcTestBehavior">
      <!-- To avoid disclosing metadata information, set the value below to 
           false and remove the metadata endpoint above before deployment -->
      <serviceMetadata httpGetEnabled="true"/>
      <!-- To receive exception details in faults for debugging purposes, set the value below to true.  
           Set to false before deployment to avoid disclosing exception information -->
      <serviceDebug includeExceptionDetailInFaults="false"/>
      <serviceAuthorization serviceAuthorizationManagerType="Hdir.CustomAuthorizationManager, Hdir"/>
      <!--<serviceCredentials>
        <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="Hdir.Hp.Data.CustomUserNameValidator, Hdir.Hp.Data" />
      </serviceCredentials>-->
    </behavior>
  </serviceBehaviors>
  <endpointBehaviors>
    <behavior name="webHttpBehavior">
      <!--<webHttp/>-->
    </behavior>
  </endpointBehaviors>
</behaviors>
</system.serviceModel>
<system.webServer>
<directoryBrowse enabled="true"/>
<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*"/>
    <add name="Access-Control-Allow-Headers" value="x-requested-with"/>
    <add name="Access-Control-Request-Method" value="GET"/>
  </customHeaders>
</httpProtocol>
</system.webServer>
</configuration>
...