web-dev-qa-db-ja.com

WCF-Windows認証-セキュリティ設定には匿名が必要

サーバー上でWCFサービスをIISで実行するのに苦労しています。展開後、エラーメッセージが表示されます。

このサービスのセキュリティ設定には「匿名」認証が必要ですが、IISこのサービスをホストするアプリケーション)では有効になっていません。

Windows認証を使用したいので、匿名アクセスが無効になっています。また、aspNetCompatibilityEnabled(違いがある場合)があることに注意してください。

これが私のweb.configです。

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
    <bindings>
        <webHttpBinding>
            <binding name="default">
                <security mode="TransportCredentialOnly">
                    <transport clientCredentialType="Windows" proxyCredentialType="Windows"/>
                </security>
            </binding>
        </webHttpBinding>
    </bindings>
    <behaviors>
        <endpointBehaviors>
            <behavior name="AspNetAjaxBehavior">
                <enableWebScript />
                <webHttp />
            </behavior>
        </endpointBehaviors>
        <serviceBehaviors>
            <behavior name="defaultServiceBehavior">
                <serviceMetadata httpGetEnabled="true" httpsGetEnabled="false" />
                <serviceDebug includeExceptionDetailInFaults="true" />
                <serviceAuthorization principalPermissionMode="UseWindowsGroups" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <services>
        <service name="xxx.Web.Services.RequestService" behaviorConfiguration="defaultServiceBehavior">
            <endpoint behaviorConfiguration="AspNetAjaxBehavior" binding="webHttpBinding"
             contract="xxx.Web.Services.IRequestService" bindingConfiguration="default">
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" name="mex" contract="IMetadataExchange"></endpoint>
        </service>
    </services>
</system.serviceModel>

私はインターネット上で運よく検索しました。手がかりは大歓迎です。

43
Rashack

かなり一般的な問題のようです。ポイントは、バインディングからmexを削除することです。

<endpoint address="mex" binding="mexHttpBinding" name="mex" contract="IMetadataExchange"></endpoint>

または、IISで匿名アクセスを有効にし、web.configで匿名アクセスが拒否されていることを確認します。

これが他の魂に役立つことを願っています。 (mexを削除して試してみました。:-O)

42
Rashack

これを確認できます one 。期待どおりに機能するようになりました。

<configuration>
  ...
  <system.serviceModel>
    ...
    <bindings>
      <basicHttpBinding>
        <binding>
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Windows" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    ...
  </system.serviceModel>
  ...
</configuration>
14
Padel

mexにもサービスバインディングを使用するだけです。

したがって、現在の構成を変更します。

<endpoint address="mex" binding="mexHttpBinding" name="mex" contract="IMetadataExchange"></endpoint>

<endpoint address="mex" binding="webHttpBinding" bindingConfiguration="default" name="mex" contract="IMetadataExchange"></endpoint>

これで問題は解決するはずです

11
sandyiit

匿名認証は、サイトではなくサービスに対して有効にできる場合があり、場合によっては有効にする必要があります。

そのため、サイトの「ルート」認証でWindows認証のみが有効になっていることを確認してください。次に、サイトを展開し、「サービス」フォルダーを選択して、サービスでWindows認証と匿名認証が有効になっていることを確認します。

これが機能する同一の環境がありましたが、これらの環境の違いはサービスの認証だけでした。私の場合の問題は、選択されたプロバイダー(NtlmまたはNegotiate)ではなく、サイトとサービスの認証設定が原因でした。

少なくとも、基本的なMSSQL Master Data ServicesのWebサイトとサービスと同じエラーメッセージがあり、これが解決策でした。サービスだけを実行するとエラーが発生しましたが、サイトはほぼ正常に機能しました。最初はサービスの認証設定が間違っていたため、MDS Explorerは機能しませんでした。この誤った構成の原因は、新しいMDSサイトを作成する際のMDS Configuration Managerのバグかもしれませんか?

そのため、私の場合、web.configファイルやApplicationHost.configファイルに対して特別な編集を行っても問題は修正されませんでしたが、構成ファイルの編集は一切行いませんでした。 IIS manager。

3
Atte

'mex'エンドポイントを削除し、clientCredentialType = 'Ntlm'を設定しても、SharePoint内でWCFをホストしていました。

1
Sagar S.

はい、mexエンドポイントを完全に削除する必要があるようです。設定

<serviceMetadata httpGetEnabled="false"/>

単独では機能しませんでした。ありがとう!

0
Narayana

このMEXバインディングの問題は.NET 4.0で修正されたようです。サーバーのApp Pool .NET CLRバージョンを2.0から4.0に変更すると、問題は解決しました。

0
csrowell

追加のソリューション:

サービス名と契約が正しいことを確認するだけです。

それが何らかの形で役立つことを願っています。

0
SyntaxError