网络凭据使用默认凭据不起作用

本文关键字:不起作用 默认 网络 | 更新日期: 2023-09-27 17:57:00

我们很久以前就编写了一段代码来调用具有域凭据的服务。现在域已更改,并计划使用默认的Windows帐户

所以我正在尝试通过配置重置 asmx 网络服务的网络凭据。我创建了一个 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;
              }
          }                
        }
    }
}

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

有人知道如何通过配置动态更改用于 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] <<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)

更新 2

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

AcquireDefaultCredential(package = NTLM, intent  = Outbound) 

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

网络凭据使用默认凭据不起作用

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

<appSettings>
    <add key="YourDomain" value="yourAccount"/>
    <add key="UserName" value="yourAccount"/>
    <add key="Password" value="yourAccount"/>
</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);