WCF-Service kann nur Lokal ausgeführt werden - Extern HTTP 401

SoerenSchmidt

Grünschnabel
Hallo,

ich habe ein Problem mit der Authentifizierung eines Webservice den ich selbst geschrieben habe. Solange er Lokal aufgerufen wird, arbeitet alles wie erwartet. Jedoch sobald der Aufruf von einer anderen Maschine eintrifft, sendet der IIS den HTTP-Code 401 (Authorization required). Eigentlich ist der Service auf Anonymous-Authentifizierung eingestellt (IIS-Konfiguration der Maschine, Standardwebseite und Web.config des Service selbst), dennoch erwartet der IIS eine Windows-Authentifizierung.
Die NTFS-Rechte können ausgeschlossen werden, da "*.aspx"-Seiten auch extern aufgerufen werden können, nur wenn eine Funktion innerhalb der "*.svc"-Datei angesprochen wird, fordert der IIS die Authentifizierung.

Hat hier jemand eine Idee, was das Problem sein könnte? Gibt es eventuell eine spezielle Konfigurationsdatei der Windows Communication Foundation?

Weitere Informationen:

Webserver: IIS 7
OS: Windows Server 2008
IDE: Visual Studio 2008
.NET Framework: 3.5 SP1
AspKompatibilität wird benötigt.
Service Architektur: REST
HTTP-Handler: svc-Integrated
AppPool: DefaultAppPool (Integrated)


Hier ist die Web.config des Webservice. Habe ich vielleicht hier etwas vergessen, oder falsch eingetragen?

Code:
<system.web>
		<compilation debug="true">
			<assemblies>
				<add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
				<add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
				<add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
				<add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
			</assemblies>
		</compilation>
    <anonymousIdentification enabled="true"/>
    <authorization>
      <allow users="?"/>
      <deny users="*"/>
    </authorization>
    <pages>
      <controls>
        <add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
      </controls>
    </pages>
    
    <httpHandlers>
      <remove verb="*" path="*.asmx"/>
      <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
      <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
      <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false"/>
    </httpHandlers>

    <httpModules>
      <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    </httpModules>
    
	</system.web>
  
	<system.codedom>
		<compilers>
			<compiler language="c#;cs;csharp" extension=".cs" warningLevel="4" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
				<providerOption name="CompilerVersion" value="v3.5" />
				<providerOption name="WarnAsError" value="false" />
			</compiler>
		</compilers>
	</system.codedom>
 
  <system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules>
      <remove name="ScriptModule" />
      <add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    </modules>
    <handlers>
      <remove name="WebServiceHandlerFactory-Integrated"/>
      <remove name="ScriptHandlerFactory" />
      <remove name="ScriptHandlerFactoryAppServices" />
      <remove name="ScriptResource" /> 
      <add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode"
           type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
      <add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode"
           type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
      <add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    </handlers>
    <defaultDocument>
      <files>
        <add value="Service.svc" />
      </files>
    </defaultDocument>
  </system.webServer>
  
	<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
    <bindings>
      <basicHttpBinding>
        <binding name="basicBinding" maxReceivedMessageSize="655360">
          <readerQuotas maxArrayLength="655360" />
          <security mode="None"/>
        </binding>
      </basicHttpBinding>
      <webHttpBinding>
        <binding name="ConMMBinding" maxReceivedMessageSize="655360">
          <readerQuotas maxArrayLength="655360" />
          <security mode="None"/>
        </binding>
      </webHttpBinding>
    </bindings>
    <behaviors>
      <endpointBehaviors>
        <behavior name="httpBehavior">
          <webHttp />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehavior">
          <serviceCredentials>
           <windowsAuthentication allowAnonymousLogons="true"/>
          </serviceCredentials>

          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug httpHelpPageEnabled="true" includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    
		<services>
			<service name="Service" behaviorConfiguration="ServiceBehavior">
        <endpoint address="" behaviorConfiguration="httpBehavior" binding="webHttpBinding" bindingConfiguration="ConMMBinding" contract="IService">
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange">
          <headers>
            <system.webServer>
              <security>
                <authentication>
                  <anonymousAuthentication enabled="true"/>
                </authentication>
                <authorization>
                  <add accessType="Allow" users="?"/>
                </authorization>
              </security>
            </system.webServer>
          </headers>
        </endpoint>
			</service>
		</services>
	</system.serviceModel>
</configuration>

Wenn ich versuche hier im Bereich Webserver die Authentifizierung einzustellen, bekomme ich die Meldung, dass mir es von einer höheren Instanz verboten ist, oder das Überschreiben untersagt ist.
Quelltext der nicht einzustellen geht:
Code:
<system.webServer>
...
    <security>
      <authentication>
        <anonymousAuthentication enabled="true"/>
        <windowsAuthentication enabled="false" />
      </authentication>
    </security>
  </system.webServer>

Welche Instanz könnte das sein? Oder wie kann ich das Überschreiben erlauben?
Im IIS-Manager sind die Methoden so eingestellt, wie ich sie auch versuche in der Web.config zu setzen.

Ich danke vielmals im Voraus und hoffe, dass mir jemand weiterhelfen kann.

Mit freundlichen Grüßen
Sören Schmidt
 
Hallo,
ich habe weiter tausende von Einstellungen versucht, mit dem Ergebnis, dass ich bereits eines meiner Testsysteme zerstört habe. Mir ist nun jedoch aufgefallen, dass es nichts mit dem Zugriff von einer externen Maschine zutun hat, das Verhalten kann ich reproduzieren, sobald nicht der Eintrag "localhost", sondern direkt die IP-Adresse verwendet wird.
Hat hier jemand einen Tip, was ich falsch mache?

Das mit dem Verbot zum Überschreiben kann in der "maschine.config" eingestellt werden. Diese Datei befindet sich normalerweise im Verzeichnis des Frameworks. Z.B.: C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG.

Grüße Sören
 
Zuletzt bearbeitet:
Zurück