1

個別のWebアプリケーションでファイルレス.svcサービスをホストすることを担当する共通のdll(API)があります。したがって、API はさまざまな Web アプリケーションから参照されます。サービス エンドポイントとして BasicHttpBinding を使用し、セキュリティ モードとして API で「BasicHttpSecurityMode.None」を使用します。

IIS の Web アプリケーションで「匿名認証」が有効になっている場合、ファイルレス *.svc が正常にホストされ、ブラウザから呼び出してメタデータを表示できます。

一方、IIS の Web アプリケーションで「匿名認証」が無効になっており、「Windows 認証」が有効になっている場合は、次のエラーが発生します。

「ホスト ('IntegratedWindowsAuthentication') で構成された認証スキームは、バインディング 'MyService' ('Anonymous') で構成されたものを許可しません。SecurityMode が Transport または TransportCredentialOnly に設定されていることを確認してください。さらに、これは変更することで解決される場合があります。 IIS 管理ツール、ServiceHost.Authentication.AuthenticationSchemes プロパティ、要素のアプリケーション構成ファイル、バインディングの ClientCredentialType プロパティの更新、または HttpTransportBindingElement の AuthenticationScheme プロパティの調整を介して、このアプリケーションの認証スキームを変更します。」

以下のコードで問題を解決する方法を見つけました。ただし、IIS 上の Web アプリケーションの認証ステータスを知る必要があります。現在の Web アプリケーションの認証ステータスをプログラムで把握する方法が見つかりませんでした。おそらく、Web アプリケーションの web.config で、指定された認証ステータスを手動で設定できます。

web.config 設定

<appSettings>
     <add key="IS_ANONYMOUS" value="True"/>
</appSettings>

Binding を作成するためのコード ブロックは次のとおりです。

     public BasicHttpBinding GetBasicHttpBinding( string bindingName, bool isAnonymous ) {

        BasicHttpBinding binding = new BasicHttpBinding();
        binding.Security.Mode = BasicHttpSecurityMode.None;

        if (!isAnonymous) {
            binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
            binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm;
            binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None;
            binding.Security.Transport.Realm = "";
            binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName;
            binding.Security.Message.AlgorithmSuite = SecurityAlgorithmSuite.Default;
        }

        binding.Name = bindingName;
        binding.MaxReceivedMessageSize = int.MaxValue;
        binding.ReaderQuotas.MaxStringContentLength = int.MaxValue;
        return binding;
    }

サービスをホストする方法は次のとおりです。

    internal static ServiceHost CreateServiceHost( Type implementedContractType, Type serviceType, Uri[] baseAddresses ) {
        ServiceHost host = new ServiceHost( serviceType, baseAddresses );
        BasicHttpBinding binding = GetBasicHttpBinding( serviceType.Name, false );
        host.AddServiceEndpoint( implementedContractType, binding, "" );
        return host;
    }

私の質問は、Web アプリケーションの認証ステータスの影響を受けないようにサービス ホストを作成する方法です。Web アプリケーションの認証ステータスを認識せずに匿名でアクセスできるファイルレス .svc ファイルを作成する方法はありますか?

4

0 に答える 0