NetworkCredential UseDefaultCredentials无法正常工作

我们编写了一个代码,用于调用具有域凭据的服务。 现在域已更改并计划使用默认Windows帐户

所以我试图通过配置重置asmx webservice的网络凭据。 我创建了一个SoapExtentsion类,并尝试覆盖它,即使它执行该行。 但它永远不会被应用,并且总是以下现有的代码获胜

实际代码

EmployeeService prxy = new EmployeeService(); prxy.Credentials = new System.Net.NetworkCredential("MyAccount", "pwd", "MyDomain"); //prxy.UseDefaultCredentials = true;// It works but we dont want code change prxy.GetEmployee(empId); 

新代码/配置仅更改

计划通过额外的dll和配置更改注入。 因此,现在不需要/禁止原始代码中的代码更改

 public class WindowsDefCredSoapExtn : SoapExtension { public override object GetInitializer(Type serviceType) { return ""; } public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute) { return ""; } public override void Initialize(object initializer) { //throw new NotImplementedException(); } public override void ProcessMessage(SoapMessage message) { if (message is SoapClientMessage) { if (message.Stage == SoapMessageStage.BeforeSerialize) { ((SoapClientMessage)message).Client.Credentials=null; (((SoapClientMessage)message)).Client.UseDefaultCredentials = true; } } } } }        

任何人都知道如何通过配置动态更改用于ASMX服务的网络凭据?

更新:

在调试时,我可以看到网络凭据被重置。 但不知何故,它在调用请求时会发送到服务器。

 EmployeeService prxy = new EmployeeService(); prxy.Credentials = new System.Net.NetworkCredential("MyAccount", "pwd", "MyDomain"); //while debug, prxy.UseDefaultCredentials= false here //My soap extension gets executed and resets credentials. prxy.GetEmployee(empId); //while debug, prxy.UseDefaultCredentials= true here //while debug prxy.Credentials are null here. 

输出窗口:

查看最后一行AcquireCredentialsHandle传递authdata 。 即使我的服务扩展重置,也会使用prxy.Credentials = new System.Net.NetworkCredential("MyAccount", "pwd", "MyDomain")中设置的凭据。

 System.Net Verbose: 0 : [11584] WebRequest::Create(http://employee-service/empService.asmx) System.Net Verbose: 0 : [11584] HttpWebRequest#39256744::HttpWebRequest(http://employee-service/empService.asmx#173042156) System.Net Information: 0 : [11584] RAS supported: True System.Net Verbose: 0 : [11584] Exiting HttpWebRequest#39256744::HttpWebRequest() System.Net Verbose: 0 : [11584] Exiting WebRequest::Create() -> HttpWebRequest#39256744 System.Net Verbose: 0 : [11584] HttpWebRequest#39256744::GetRequestStream() System.Net Information: 0 : [11584] Associating HttpWebRequest#39256744 with ServicePoint#19085264 System.Net Information: 0 : [11584] Associating Connection#65246235 with HttpWebRequest#39256744 System.Net.Sockets Verbose: 0 : [11584] Socket#27993665::Socket(InterNetwork#2) System.Net.Sockets Verbose: 0 : [11584] Exiting Socket#27993665::Socket() System.Net.Sockets Verbose: 0 : [11584] Socket#27993665::Connect(45:80#763949146) System.Net.Sockets Information: 0 : [11584] Socket#27993665 - Created connection from 10.234.80.99:48954 to 10.242.137.45:80 System.Net Information: 0 : [11584] HttpWebRequest#39256744 - Request: POST /empService.asmx HTTP/1.1 System.Net.Sockets Verbose: 0 : [11584] Socket#27993665::Send() System.Net.Sockets Verbose: 0 : [11584] Data from Socket#27993665::Send System.Net.Sockets Verbose: 0 : [11584] < 512#512 System.Net Information: 0 : [11584] ConnectStream#50996063 - Sending headers { User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 4.0.30319.2034) VsDebuggerCausalityData: uIDPo3GOBVodvqZLgUWyCSNWI5kAAAAAzHBQpKvNJ0SvKGwy+a3tGerbsJdijWdHqs2PJipnfqYACQAA Content-Type: text/xml; charset=utf-8 SOAPAction: "http://employee-service/GetProperties" Host: employee-service Content-Length: 507 Expect: 100-continue Connection: Keep-Alive }. System.Net.Sockets Verbose: 0 : [11584] Socket#27993665::Receive() System.Net.Sockets Verbose: 0 : [11584] Data from Socket#27993665::Receive System.Net.Sockets Verbose: 0 : [11584] <> System.Net.Sockets Verbose: 0 : [11584] Exiting Socket#27993665::Receive() -> 109#109 System.Net Information: 0 : [11584] Connection#65246235 - Received status line: Version=1.1, StatusCode=401, StatusDescription=Unauthorized. System.Net Information: 0 : [11584] Connection#65246235 - Received headers { Content-Length: 0 Date: Fri, 08 Jul 2016 16:11:15 GMT WWW-Authenticate: NTLM }. System.Net Information: 0 : [11584] ConnectStream#7794715::ConnectStream(Buffered 0 bytes.) System.Net.Sockets Verbose: 0 : [11584] Socket#27993665::MultipleSend() System.Net.Sockets Verbose: 0 : [11584] Exiting Socket#27993665::MultipleSend() System.Net Verbose: 0 : [11584] Data from ConnectStream#50996063::ResubmitWrite System.Net Information: 0 : [11584] Associating HttpWebRequest#39256744 with ConnectStream#7794715 System.Net Information: 0 : [11584] Associating HttpWebRequest#39256744 with HttpWebResponse#29471296 System.Net Information: 0 : [11584] Enumerating security packages: System.Net Information: 0 : [11584] Negotiate System.Net Information: 0 : [11584] Kerberos System.Net Information: 0 : [11584] NTLM System.Net Information: 0 : [11584] Microsoft Unified Security Protocol Provider System.Net Information: 0 : [11584] Schannel System.Net Information: 0 : [11584] WDigest System.Net Information: 0 : [11584] DPA System.Net Information: 0 : [11584] Digest System.Net Information: 0 : [11584] MSN System.Net Information: 0 : [11584] AcquireCredentialsHandle(package = NTLM, intent = Outbound, authdata = MyDomain\MyAccount) 

更新2

我刚刚为测试做了代码更改,下面是套接字通信的差异

 AcquireDefaultCredential(package = NTLM, intent = Outbound) 

VS

 AcquireCredentialsHandle(package = NTLM, intent = Outbound, authdata = MyDomain\MyAccount) 

如果我理解正确,那么我认为您需要在配置文件中的appSettings下为您的帐户,用户名和密码添加密钥。

      

在你的代码中,

 EmployeeService prxy = new EmployeeService(); prxy.Credentials = new System.Net.NetworkCredential(System.Configuration.ConfigurationManager.AppSettings["UserName"].ToString(), System.Configuration.ConfigurationManager.AppSettings["Password"].ToString(), System.Configuration.ConfigurationManager.AppSettings["YourDomain"].ToString()); //while debug, prxy.UseDefaultCredentials= false here //My soap extension gets executed and resets credentials. prxy.GetEmployee(empId);