web-dev-qa-db-ja.com

WCF基本認証

単純なテストWcfサービスで基本認証を使用する際に問題が発生します。例外が発生しています:

要求されたサービス「http://qld-tgower/test/Service.svc」をアクティブにできませんでした。詳細については、サーバーの診断トレースログを参照してください。

そして、トレースログに次のように表示されます。

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

しかし、間違ったユーザー名とパスワードを言ったときに理解できないのは、[〜#〜] is [〜#〜]基本認証を使用しているということですか?

HTTP要求は、クライアント認証スキーム「基本」で許可されていません。サーバーから受信した認証ヘッダーは「Basic realm = "qld-tgower"」でした。

これは私のweb.configの詳細です

<system.serviceModel>
<services>
  <service name="WcfService"
      behaviorConfiguration="Behavior">
    <endpoint address="http://QLD-TGOWER/test/Service.svc"
              binding="basicHttpBinding"
              bindingConfiguration="httpBinding"
              contract="IService" />
  </service>
</services>
<diagnostics>
  <endToEndTracing activityTracing="false" messageFlowTracing="true" propagateActivity="true"></endToEndTracing>
</diagnostics>
<bindings>
  <basicHttpBinding>
    <binding name="httpBinding">
      <security mode="TransportCredentialOnly">
        <transport  clientCredentialType="Basic" proxyCredentialType="Basic">
        </transport>
      </security>
    </binding>
  </basicHttpBinding>
</bindings>
<behaviors>
  <serviceBehaviors>
    <behavior>
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
      <serviceMetadata httpGetEnabled="true"/>
      <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
      <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>
  </serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
</system.serviceModel>

これは私のApp.configです

<system.serviceModel>
    <diagnostics>
      <endToEndTracing activityTracing="true" />
      <messageLogging logMessagesAtTransportLevel="true" />
    </diagnostics>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IService" >
          <security mode="TransportCredentialOnly">

            <transport clientCredentialType="Basic" proxyCredentialType="Basic"></transport>
            <message clientCredentialType="UserName" />
          </security>

        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://QLD-TGOWER/test/Service.svc" binding="basicHttpBinding"
        bindingConfiguration="BasicHttpBinding_IService" contract="ServiceReference1.IService"
        name="BasicHttpBinding_IService" />
    </client>
</system.serviceModel>

私のテストアプリケーション

private static void Main(string[] args)
{
    var proxy = new ServiceClient("BasicHttpBinding_IService");
    var clientCredentials = proxy.ClientCredentials;
    clientCredentials.UserName.UserName = "username";
    clientCredentials.UserName.Password = "password";
    var res = proxy.GetData(1);
    Console.WriteLine(res);
    Console.WriteLine("Done");
    Console.ReadKey(true);
}

そして私のサービス

public class Service : IService
{

   public string GetData(int value)
   {
       return string.Format("You entered: {0}", value);
   }
}

ここに欠けているものはありますか?

20
TheRealTy

サービスの名前とコントラクトを変更して、名前空間を含めます。

また、エンドポイントアドレスを削除(「」に設定)し、proxyCredentialTypeをトランスポートタグに含めないでください。

Web.configの最終結果は次のようになります。

  <system.serviceModel>

    <services>
      <service name="MyNameSpace.MyService" behaviorConfiguration="asdf">
        <endpoint address="" binding="basicHttpBinding" 
            bindingConfiguration="httpBinding" contract="MyNameSpace.IMyService" />
      </service>
    </services>

    <diagnostics>
      <endToEndTracing activityTracing="true" messageFlowTracing="true" 
          propagateActivity="true">
      </endToEndTracing>
    </diagnostics>

    <bindings>
      <basicHttpBinding>
        <binding name="httpBinding">
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Basic" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>

    <behaviors>
      <serviceBehaviors>
        <behavior name="asdf">
          <!-- To avoid disclosing metadata information, set the value below to 
               false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true" />
          <!-- To receive exception details in faults for debugging purposes, 
               set the value below to true.  Set to false before deployment to avoid 
               disclosing exception information -->
          <serviceDebug  includeExceptionDetailInFaults="true" />

        </behavior>
      </serviceBehaviors>
    </behaviors>

    <serviceHostingEnvironment multipleSiteBindingsEnabled="false"/>

  </system.serviceModel>
19
Trent Scholl

クライアントとサーバーの両方の設定を試してください

<basicHttpBinding>
    <binding name="BasicHttpBinding_IService">
        <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Basic" />
        </security>
    </binding>
</basicHttpBinding>

基本認証のインストール/有効化

IISに基本認証をインストールして適用する必要がある場合もあります。

「プログラムと機能」/「Windowsの機能をオン/オフにする」に移動します。 IISおよびセキュリティの下のどこかで「基本認証」を有効にします。

IISコンソールを閉じて開き、認証設定で有効にすることができました。

もちろん、これは開発テスト用であり、SSL証明書がないことを警告する場合です。

3
Valamas

これが私にとって問題を解決したものです:

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

参照用: https://msdn.Microsoft.com/en-gb/library/ff648505.aspx

1
Vedran

セキュリティで保護されていない接続でユーザー名認証を使用することは許可されていません

安全なトランスポート(SSLなど)またはメッセージの暗号化(証明書を使用)を使用して、メッセージを保護できます。

私は ClearUsernameBinding を過去に使用して大成功を収めましたが、実稼働環境ではお勧めしません。開発/テスト環境でSSLを必要とせずにすべての認証コードを同じに保つことができるように使用しましたが、構成のみを変更することでSSLで動作します。

注:カスタムバインディングは完全ではないため、特定の構成変更を有効にするために少し変更する必要がありました。

1
Luke Schafer