Windows資格情報を使用する必要がある魔女を消費するWebサービス(ASMX)が与えられました。
そこで、クライアント VPN をセットアップして WSDL を呼び出し、XML ファイルとして保存し、.xml を使用してプロキシ クラスを生成しましたsvcutil.exe
。
私はサービスを次のように呼び出しています
// Web Service
client = new CmListSync.Models.WebCorePlayersSoapClient();
client.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
client.ClientCredentials.Windows.ClientCredential = new System.Net.NetworkCredential(cUser, cPass, cDoma);
そして、web.config
私はこのセットアップを持っています:
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WebCorePlayersSoap" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="true" />
<security mode="None">
<transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />
<message clientCredentialType="Windows" algorithmSuite="Default" negotiateServiceCredential="true" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="http://vm-wssrv01/players.asmx" binding="wsHttpBinding"
bindingConfiguration="WebCorePlayersSoap" contract="WebCorePlayersSoap"
name="WebCorePlayersSoap" />
</client>
</system.serviceModel>
しかし、サービスを呼び出そうとすると、次のような例外が発生します。
HTTP 要求は、クライアント認証スキーム「匿名」では許可されていません。サーバーから受信した認証ヘッダーは「Basic realm=\"vm-wssrv01\"」でした。
私は何が欠けていますか?Windows資格情報を提供したので、サービスは正常に認証されるべきではありませんか? これ以上何をすればいいですか?
私が試したこと:
- セキュリティモードをに設定する
Message
と、上記の質問と同じエラーが発生しました - セキュリティ モードを
TransportWithMessageCredential
I got: The provided URI scheme 'http' is invalid; に設定します。'https' が必要です。\r\nパラメータ名: via - セキュリティ モードを に設定する
Transport
と、WSHttpBinding がトランスポート セキュリティ (HTTPS) を介した信頼できるセッションをサポートしていないため、バインディングの検証に失敗しました。チャネル ファクトリまたはサービス ホストを開くことができませんでした。HTTP を介した安全で信頼性の高いメッセージングには、メッセージ セキュリティを使用します。
ジョン・サンダースのコメントから:
に切り替えましたbasicHttpBinding
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="WebCorePlayersSoap" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="Windows" proxyCredentialType="Windows" realm="vm-wssrv01" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://vm-wssrv01/players.asmx" binding="basicHttpBinding"
bindingConfiguration="WebCorePlayersSoap" contract="WebCorePlayersSoap"
name="WebCorePlayersSoap" />
</client>
</system.serviceModel>
security
モードを次のように変更しようとしました:
TransportWithMessageCredential
{"指定された URI スキーム 'http' は無効です。'https' が必要です。\r\nパラメータ名: via"}TransportCredentialOnly
{"HTTP 要求は、クライアント認証スキーム「ネゴシエート」では許可されていません。サーバーから受信した認証ヘッダーは、「基本レルム =\"vm-wssrv01\"' でした。」}Message
{"BasicHttp バインディングでは、BasicHttpBinding.Security.Message.ClientCredentialType が、安全なメッセージの BasicHttpMessageCredentialType.Certificate 資格情報タイプと同等である必要があります。UserName 資格情報には、Transport または TransportWithMessageCredential セキュリティを選択してください。"}Transport
{"指定された URI スキーム 'http' は無効です。'https' が必要です。\r\nパラメータ名: via"}None
{"HTTP リクエストは、クライアント認証スキーム「匿名」では許可されていません。サーバーから受信した認証ヘッダーは、「基本レルム =\"vm-wssrv01\"' でした。」}
私はアイデアを使い果たしています:(サービスはHTTPのみであり、HTTPSではなく、使用する証明書がありません...