NetworkCredential UseDefaultCredentials not working
Asked Answered
D

1

8

We wrote a code long back to call a service with domain credentials. Now domains are changed and planning to use default Windows Account

So I am trying to reset Network credentials for a asmx webservice via config. I created a SoapExtentsion class and trying to override there even it executes the line. But it never gets applied and always the below existing code win

Actual Code

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

New Code / Config Change only

Planning to inject via additional dll and config changes. So the code change in original above code is not required/prohibited now

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;

              }
          }                

        }

    }
}


 <system.web>
    <webServices>
      <soapExtensionTypes>
        <add type="MyAssembly.WindowsDefCredSoapExtn, MyAssembly" priority="1" group="Low"/>
      </soapExtensionTypes>
    </webServices>
  </system.web>

Any one know how to dynamically change the Network Credentials used for a ASMX service via config?

UPDATE:

While debug, I could see the network credentials are reset. But somehow it sends to server when invoking the request.

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. 

Output Window:

See the last line AcquireCredentialsHandle passes authdata. The credentials which set in prxy.Credentials = new System.Net.NetworkCredential("MyAccount", "pwd", "MyDomain") being used even though my service extension reset.

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] <<POST /empService.asmx HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 4.0.30319.2034)

System.Net.Sockets Verbose: 0 : [11584] Exiting Socket#27993665::Send()     -> 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] <<HTTP/1.1 401 Unauthorized
Content-Length: 0
WWW-Authenticate: NTLM
Date: Fri, 08 Jul 2016 16:11:15 GMT

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

UPDATE 2

I just did a code change for tesing and below is difference in the socket communication

AcquireDefaultCredential(package = NTLM, intent  = Outbound) 

Vs

AcquireCredentialsHandle(package  = NTLM, intent   = Outbound, authdata = MyDomain\MyAccount)
Dingbat answered 13/7, 2016 at 17:6 Comment(2)
If I recall, code config always wins over config files, by design in .NET framework. Config is loaded first, and when code runs, it will overwrite the setting.Dissonance
My code injected via config runs again and reset the value. But somehow it is sending the credentials set already.Dingbat
N
0

If I understood you correctly then I think you need to add keys for your Account, User Name and Password under appSettings in the config file.

<appSettings>
    <add key="YourDomain" value="yourAccount"/>
    <add key="UserName" value="yourAccount"/>
    <add key="Password" value="yourAccount"/>
</appSettings>

After that in your code,

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);
Neaten answered 21/7, 2016 at 10:9 Comment(2)
This is what I have currently and want to get rid of this... The actual question is how to get rid of this via config.Dingbat
Its not possible to get rid of this.Izy

© 2022 - 2024 — McMap. All rights reserved.