Проверка подлинности Azure active directory, размещенная в Azure WCF, возвращает 404

Я новичок в WCF. Я создал метод WCF, который возвращает файл. Я развернул его в службе приложений azure, и он работал, когда я называл его так

https://myapp.azurewebsites.net/myService.svc/MyMethod?MyParam=MyValue

Затем я включил проверку подлинности Azure active directory для службы приложений azure и теперь получаю ошибку 404. Но аутентификация против AAD работает — я перенаправляюсь на страницу входа, если я не опален в пользователе.

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

Web config:

    <?xml version="1.0"?>
<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true"/>
  </appSettings>
  <system.web>
    <customErrors mode="Off"/>
    <compilation targetFramework="4.5.2"/>
    <httpRuntime targetFramework="4.5.2"/>
    <httpModules>
      <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web"/>
    </httpModules>
  </system.web>

  <system.serviceModel>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    <bindings>
      <webHttpBinding>
        <binding name="ServiceWebBindingName" transferMode="Streamed" maxReceivedMessageSize="2147483647" >
          <readerQuotas  maxArrayLength="2147483647" maxStringContentLength="2147483647" />
        </binding>
      </webHttpBinding>
    </bindings>
    <behaviors>
      <endpointBehaviors>
        <behavior name="DefaultRestServiceBehavior">
          <webHttp defaultOutgoingResponseFormat="Json" defaultBodyStyle="Wrapped" automaticFormatSelectionEnabled="false"/>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service name="My.App.Service">
        <endpoint address="myService.svc"
              binding="webHttpBinding"
              bindingConfiguration="ServiceWebBindingName"
              behaviorConfiguration="DefaultRestServiceBehavior"
              name="FileManagerServiceEndpoint"
              contract="My.App.IService"/>
      </service>
    </services>
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <remove name="ApplicationInsightsWebTracking"/>
      <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web"
        preCondition="managedHandler"/>
    </modules>
    <!--
        To browse web app root directory during debugging, set the value below to true.
        Set to false before deployment to avoid disclosing web app folder information.
      -->
    <directoryBrowse enabled="false"/>
    <validation validateIntegratedModeConfiguration="false"/>
  </system.webServer>

</configuration>

1 ответ

  1. Таким образом, я обнаружил, что не заметил, что мой исходный url-адрес службы был

    http://myapp.azurewebsites.net/myService.svc/MyMethod?MyParam=MyValue
    

    и один, на который я был перенаправлен после добавления проверки подлинности azure ad был

    https://myapp.azurewebsites.net/myService.svc/MyMethod?MyParam=MyValue
    

    Поэтому перенаправление указывает на HTTPS, а не HTTP.

    Вероятно, можно установить приложение azure ad не принуждать трафик HTTPS, однако в духе безопасности и во избежание возможных проблем с переключением зоны IE я добавил транспорт HTTPS к моей привязке WCF в интернете.конфиг. Вот отличный пример, как это сделать, как включить HTTPS на WCF RESTful Service? и теперь он работает безупречно.