web-dev-qa-db-ja.com

WcfサービスをIntegratedWindowsAuthenticationにする

IISでWindows認証を有効にし、匿名を無効に設定すると、次のエラーが表示されます。

ホストで構成された認証スキーム( 'IntegratedWindowsAuthentication')は、バインディング 'BasicHttpBinding'( '匿名')で構成された認証スキームを許可しません。 SecurityModeがTransportまたはTransportCredentialOnlyに設定されていることを確認してください。さらに、このアプリケーションの認証方式をIIS管理ツール、ServiceHost.Authentication.AuthenticationSchemesプロパティ、要素のアプリケーション構成ファイルで、バインディングのClientCredentialTypeプロパティ、またはHttpTransportBindingElementのAuthenticationSchemeプロパティを調整する。

私のWcfサービスのweb.configは次のとおりです...

<?xml version="1.0"?>
<configuration>
  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5"/>
  </system.web>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpEndpointBinding">
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Windows" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint binding="basicHttpBinding" 
        bindingConfiguration="BasicHttpEndpointBinding"
        contract="Test.IService1" name="BasicHttpEndpoint" />
    </client>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceAuthenticationManager 
             authenticationSchemes="IntegratedWindowsAuthentication"/>
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="false"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
        <add binding="basicHttpBinding" scheme="http" />
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
         multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <directoryBrowse enabled="true"/>
  </system.webServer>
</configuration>

ご意見をお聞かせください..

20
user214471

.Net 4.0+では、 Simplified WCF configuration は、構成が明示的に設定されていない場合に「匿名」構成を使用し、 <services>セクションのサービスベース。 <binding>要素からname = "BasicHttpEndpointBinding"を削除した場合、またはその<binding>要素をname属性のない新しい要素として複製した場合、それはWCFサービスが使用するデフォルトの匿名バインディングになります。これは、すべてが同じ構成を持たないWCFサービスを提供および消費する必要がある場合に役立ちますが、少なくとも特定の構成が設定されていないサービスのデフォルト構成を設定できます。デフォルト/匿名の概念は、<behavior>要素にも適用できます。

<bindings>
  <basicHttpBinding>
    <binding> <!--Notice, no name attribute set-->
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Windows" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>

また、WCFサービスで認証が必要な場合は、実際のユーザーアカウントを使用してサービスを使用するか、DOMAIN\CLIENTCOMPUTERNAME $アカウントにサービスへのアクセスを許可する必要があることを追加します。おそらく多くの人々にとって適切な解決策は、代わりに匿名アクセスを許可するように構成を変更することかもしれません(これは私の答えでは説明していません)。それでも、実際には、Windows(Kerberos)認証でWCFサービスをセキュリティで保護することを選択することがあります。

44
scradam

これを追加するとうまくいきました。

        <bindings>
        <webHttpBinding>
            <binding>
                <security mode="TransportCredentialOnly">
                    <transport clientCredentialType="Windows" />
                </security>
            </binding>
        </webHttpBinding>
    </bindings>
14
Rian

.NET 4.0から.NET 4.5.2に更新すると、このエラーが発生しました。 clientCredentialTypeを次から変更しました

<security mode="TransportCredentialOnly">
    <transport clientCredentialType="None"/>
</security>

<security mode="TransportCredentialOnly">
    <transport clientCredentialType="InheritedFromHost"/>
</security>

ただし、clientCredentialType = "Windows"の設定も同様に機能します。

2
GunnarS
<services>
      <service name="Test.Service1" behaviorConfiguration="TestName">
        <endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicHttpEndpointBinding" contract="Test.IService1" />
      </service>
    </services>

それは私の問題を解決しました。

0
Raju S Nair

WebHttpBindingを追加し、エンドポイントをポイントして、セキュリティ設定を機能させる必要がありました。それがなければ、私のエンドポイントはデフォルトのWCF構成バインディングを使用しました:

    <services>
  <service behaviorConfiguration="ServiceBehavior" name="Service">
    <endpoint address="" binding="webHttpBinding" contract="IService" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="ServiceBehavior">
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
  </serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
<bindings>
  <webHttpBinding>
      <binding>
        <!--Notice, no name attribute set-->
        <security mode="TransportCredentialOnly">
          <transport clientCredentialType="Windows" />
        </security>
      </binding>
  </webHttpBinding>

</bindings>
0
Kevin Raffay

既存のWCF Web URLを使用するときに同じ問題が発生しました。ここで言及したすべての答えを試しましたが、最終的には2つのことだけが助けになりました。

  1. 「Windowsの機能の有効化と無効化」で設定を変更します。

enter image description here

ローカルでWindows認証とともに匿名認証を有効にするIIS server。 enter image description here

0
Khushi4.net

理由は完全にはわかりませんが、「SVC」ファイルに「Factory」属性を追加すると(明示的にVisual Studioにドラッグする必要があります)、すべてがworks-Web.configのデフォルト設定を変更せずに!

Factory = "System.ServiceModel.Activation.WebServiceHostFactory"を追加したため、.SVCファイルは次のようになりました。

<%@ ServiceHost Language="C#" Debug="true" Service="ServiceNameSpace.ServiceName" CodeBehind="ServiceName.svc.cs" %>

これに:

<%@ ServiceHost Language="C#" Debug="true" Service="ServiceNameSpace.ServiceName" CodeBehind="ServiceName.svc.cs" Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>

唯一の副作用は、ブラウザで.SVCファイルをクリックすると、「エンドポイントが見つかりません」というエラーが表示されることですが、とにかく正しく呼び出すとサービスは正常に動作します。前述のように、.NET 4.6でデフォルトのWeb.configを使用しています( Simplified WCF configuration )。そのため、エンドポイントの詳細を追加して再度動作させる必要があります。

0
QA Collective

他の回答と同様に、Web.configのバインディングを次のように更新する必要がありました。

<basicHttpBinding>
  <binding name="basicHttpBindin1">
    <security mode="TransportCredentialOnly">
      <transport clientCredentialType="Windows" />
    </security>
  </binding>
</basicHttpBinding>

しかし、バインディングのインスタンス化も更新する必要がありました。

var binding = new BasicHttpBinding { MaxReceivedMessageSize = 1000000, ReaderQuotas = { MaxDepth = 200 } };

binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName;
0