WCF 客户端缓存 Windows 认证

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();

这给了我一个SecurityException异常。符合预期。

第二次运行(带有凭据):

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();

这个调用成功了,和预期一样。
第三次运行与第一次相同,没有指定凭据。这个调用成功了。现在我困惑了。凭据必须以某种方式被缓存了吗?我重新启动我的机器,结果一样。仍然成功。
然后我尝试指定虚假的凭据:
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中是否有某种凭证缓存?

1个回答

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接