4

Navision によって公開されている Web サービスを呼び出しています。これは Windows 認証で保護されています。正常に呼び出すことができますが、その後、何らかの形で資格情報をキャッシュしているように見え、それが心配です。

このサービスはリモート サーバーでホストされており、私の開発マシンとは別のドメインにあります。Visual Studio からコードを実行しています。

サービスへのサービス参照を作成しましたが、app.config に構成がないため、すべての設定はコードを使用して作成されます。

最初の実行 (クライアント資格情報が指定されていない):

var binding = new BasicHttpBinding();
binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;

var address = new EndpointAddress("http://externalserver.com/DynamicsNAV/WS/Customer/Page/MyPage");

var client = new MyPage_PortClient(binding, address);
client.ClientCredentials.Windows.AllowNtlm = true;
client.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation;

var reqObj = new MyPage() { TypeID = "Test", Company_Name = "Test:" + DateTime.Now.ToShortTimeString() };
client.Create(ref reqObj);
client.Close();
Console.WriteLine(reqObj.Company_Name);
Console.ReadLine();

これにより、セキュリティ例外が発生します。予想通り。

2 回目の実行 (資格情報あり):

var binding = new BasicHttpBinding();
binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;

var address = new EndpointAddress("http://externalserver.com/DynamicsNAV/WS/Customer/Page/MyPage");

var client = new MyPage_PortClient(binding, address);
client.ClientCredentials.Windows.ClientCredential.Domain = "MYDOM";
client.ClientCredentials.Windows.ClientCredential.UserName = "NavWebService";
client.ClientCredentials.Windows.ClientCredential.Password = "foo";
client.ClientCredentials.Windows.AllowNtlm = true;
client.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation;

var reqObj = new MyPage() { TypeID = "Test", Company_Name = "Test:" + DateTime.Now.ToShortTimeString() };
client.Create(ref reqObj);
client.Close();
Console.WriteLine(reqObj.Company_Name);
Console.ReadLine();

この呼び出しは成功します。繰り返しますが、予想どおりです。

3 回目の実行は、最初の実行と同じです。つまり、資格情報が指定されていません。その呼び出しは成功します。今、私は混乱しています。資格情報は何らかの方法でキャッシュする必要がありますか? マシンを再起動しても同じ結果です。それでも成功します。

次に、偽の資格情報を指定してみます。

var binding = new BasicHttpBinding();
binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;

var address = new EndpointAddress("http://externalserver.com/DynamicsNAV/WS/Customer/Page/MyPage");

var client = new MyPage_PortClient(binding, address);
client.ClientCredentials.Windows.ClientCredential.Domain = "fakeMYDOM";
client.ClientCredentials.Windows.ClientCredential.UserName = "fakeNavWebService";
client.ClientCredentials.Windows.ClientCredential.Password = "badPwd";
client.ClientCredentials.Windows.AllowNtlm = true;
client.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation;

var reqObj = new MyPage() { TypeID = "Test", Company_Name = "Test:" + DateTime.Now.ToShortTimeString() };
client.Create(ref reqObj);
client.Close();
Console.WriteLine(reqObj.Company_Name);
Console.ReadLine();

この呼び出しは失敗します。予想通り。

もう一度最初の呼び出しに戻りますが、それでも成功します。そのため、その間に無効な資格情報を試してみましたが、実際には最初に成功した呼び出しから資格情報をキャッシュしています。

ここで何が起こっているのか誰か教えてもらえますか? Windows認証についてわからないことはありますか?Visual Studio/WCF にある種の資格情報のキャッシュはありますか?

4

1 に答える 1

0

そうです、Windows トークンはキャッシュされています。これは、キャッシュされたトークンの偽装について説明している WCF での偽装と削除に関する MSDN の記事です。

于 2012-08-17T00:18:50.340 に答える