不工作的NetworkCredential UseDefaultCredentials [英] NetworkCredential UseDefaultCredentials not working

查看:258
本文介绍了不工作的NetworkCredential UseDefaultCredentials的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们写了一个很长的代码返回到调用服务使用域凭据。现在域改变,计划使用默认的Windows帐户



所以我想重置网络凭据通过配置一个ASMX web服务。
我创建了一个SoapExtentsion类,并试图覆盖甚至有它执行就行了。但它从来没有被应用,并始终低于现有代码的胜利



实际代码



 的EmployeeService PRXY =新的EmployeeService(); 
prxy.Credentials =新System.Net.NetworkCredential(我的帐户,PWD,MYDOMAIN);
//prxy.UseDefaultCredentials = TRUE; //它的工作原理,但我们不希望更改代码
prxy.GetEmployee(EMPID);

新代码/配置变化仅



计划通过额外的DLL和配置的变化注入。所以不需要在原有的上面的代码更改代码/禁止现在

 公共类WindowsDefCredSoapExtn:的SoapExtension 
{
公众覆盖对象GetInitializer(类型的​​serviceType)
{
返回;
}

公众覆盖对象GetInitializer(LogicalMethodInfo的MethodInfo,SoapExtensionAttribute属性)
{
返回;
}

公共覆盖无效初始化(对象初始化)​​
{
//抛出新NotImplementedException();
}

公共覆盖无效ProcessMessage的(的SOAPMessage消息)
{

如果(消息SoapClientMessage)
{
如果(message.Stage == SoapMessageStage.BeforeSerialize)
{
((SoapClientMessage)消息).Client.Credentials = NULL;
(((SoapClientMessage)消息))Client.UseDefaultCredentials =真。

}
}

}

}
}


< ;&的System.Web GT;
<&Web服务GT;
< soapExtensionTypes>
<加上TYPE =MyAssembly.WindowsDefCredSoapExtn,MyAssembly程序优先=1组=低/>
< / soapExtensionTypes>
< / WebServices的>
< /system.web>



任何一个知道如何动态地更改通过配置用于ASMX服务网络凭据?



更新:



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



 的EmployeeService PRXY =新的EmployeeService(); 
prxy.Credentials =新System.Net.NetworkCredential(我的帐户,PWD,MYDOMAIN);
//调试时,prxy.UseDefaultCredentials =假这里
//我的SOAP扩展会被执行并且重置凭证。
prxy.GetEmployee(EMPID);
//调试时,prxy.UseDefaultCredentials =真在这里
//同时调试prxy.Credentials为空在这里。



输出窗口:



请参阅最后一行AcquireCredentialsHandle通过的authData 。这在 prxy.Credentials =设置凭据新System.Net.NetworkCredential(我的帐户,PWD,MYDOMAIN)正在使用,即使我的服务扩展复位。

  System.Net详细:0:[11584]的WebRequest ::创建(HTTP://employee-service/empService.asmx )
System.Net详细:0:[11584] HttpWebRequest的#39256744 :: HttpWebRequest的(HTTP://employee-service/empService.asmx#173042156)
System.Net信息:0:[11584] RAS支持:真
System.Net详细:0:[11584]退出的HttpWebRequest#39256744 :: HttpWebRequest的()
System.Net详细:0:[11584]退出的WebRequest ::创建() - GT ; HttpWebRequest的#39256744
System.Net详细:0:[11584] HttpWebRequest的#39256744 :: GetRequestStream()
System.Net信息:0:[11584]关联的HttpWebRequest#39256744用的ServicePoint#19085264
System.Net信息:0:[11584]关联连接#65246235与HttpWebRequest的#39256744
的System.Net.Sockets详细:0:[11584]插孔#27993665 ::套接字(网间#2)
详细的System.Net.Sockets 0:[11584]退出插槽#27993665 ::插座()
的System.Net.Sockets详细:0:[11584]插孔#27993665 ::连接(45:80#763949146)
的System.Net.Sockets信息:0:[11584]插孔#27993665 - 从10.234.80.99:48954创建连接10.242.137.45:80
System.Net信息:0:[11584] HttpWebRequest的# 39256744 - 请求:POST /empService.asmx HTTP / 1.1

的System.Net.Sockets详细:0:[11584]插孔#27993665 ::发送()
的System.Net.Sockets详细0:[11584]从数据套接字#27993665 ::发送
的System.Net.Sockets详细:0:[11584]<< POST /empService.asmx HTTP / 1.1
的User-Agent: Mozilla的/ 4.0(兼容; MSIE 6.0; MS Web服务客户端协议4.0.30319.2034)

的System.Net.Sockets详细:0:[11584]退出插槽#27993665 ::发送() - GT; 512#512
System.Net信息:0:[11584] ConnectStream#50996063 - 发送头
{
的User-Agent:Mozilla的/ 4.0(兼容; MSIE 6.0; MS Web服务客户端协议4.0.30319.2034)
VsDebuggerCausalityData:uIDPo3GOBVodvqZLgUWyCSNWI5kAAAAAzHBQpKvNJ0SvKGwy + a3tGerbsJdijWdHqs2PJipnfqYACQAA
内容类型:文本/ xml的;字符集= UTF-8
的SOAPAction:HTTP://员工服务/的GetProperties
主机:员工在职
的Content-Length:507
期望:100-继续
连接:保持活动
}。
的System.Net.Sockets详细:0:[11584]插孔#27993665 ::接收()
的System.Net.Sockets详细:0:[11584]从插座#27993665 ::接收$ B数据$ b的System.Net.Sockets详细:0:[11584]<< HTTP / 1.1 401未经授权
的Content-Length:0
WWW验证:NTLM
日期:星期五,08 2016年7月16时11分15秒GMT

>>
的System.Net.Sockets详细:0:[11584]退出插槽#27993665 ::接收() - GT; 109#109
System.Net信息:0:[11584]连接#65246235 - 接收的状态行:版本= 1.1,的StatusCode = 401,状态说明=未经授权。
System.Net信息:0:[11584]连接#65246235 - 接收的头
{
的Content-Length:0
日期:星期五,2016年7月8日16时11分15秒北京时间
WWW验证:NTLM
}。
System.Net信息:0:[11584] ConnectStream#7794715 :: ConnectStream(缓冲0字节)
的System.Net.Sockets详细:0:[11584]插孔#27993665 :: MultipleSend()
的System.Net.Sockets详细:0:[11584]退出插槽#27993665 :: MultipleSend()
System.Net详细:0:[11584]数据ConnectStream#50996063 :: ResubmitWrite

System.Net信息:0:[11584]关联的HttpWebRequest#39256744与ConnectStream#7794715
System.Net信息:0:[11584]关联的HttpWebRequest#39256744与HttpWebResponse#29471296
系统.NET信息:0:[11584]枚举安全包:
System.Net信息:0:[11584]协商
System.Net信息:0:[11584] Kerberos的
System.Net信息:0:[11584] NTLM
System.Net信息:0:[11584]微软统一安全协议提供
System.Net信息:0:[11584] Schannel中
System.Net信息0:[11584] WDigest
System.Net信息:0:[11584] DPA
System.Net信息:0:[11584]文摘
System.Net信息:0:11584 ] MSN
System.Net信息:0:[11584] AcquireCredentialsHandle(包= NTLM,意图=出站的authData = MyDomain\MyAccount)

更新2



我只是做了测试功能更改代码及以下的差异socket通信

  AcquireDefaultCredential(包= NTLM,意图=出站)

VS

  AcquireCredentialsHandle(包= NTLM,意图=出站,的authData = MyDomain\MyAccount)


解决方案

如果我理解你。正确的话,我想你需要添加一个键AppSetting下的配置文件您的账户,用户名和密码。

 <的appSettings> 
<添加键=您的域VALUE =yourAccount/>
<添加键=用户名值=yourAccount/>
<添加键=密码值=yourAccount/>
< /的appSettings>

在,在你的代码,

 的EmployeeService PRXY =新的EmployeeService(); 
prxy.Credentials =新System.Net.NetworkCredential(System.Configuration.ConfigurationManager.AppSettings [用户名]。的ToString(),System.Configuration.ConfigurationManager.AppSettings [密码]的ToString(), System.Configuration.ConfigurationManager.AppSettings [您的域]的ToString())。
//调试时,prxy.UseDefaultCredentials =假这里
//我的SOAP扩展会被执行并且重置凭证。
prxy.GetEmployee(EMPID);


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)

解决方案

If I understood you correctly then I think you need to add a keys for your Account,User Name and Password under AppSetting in 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);

这篇关于不工作的NetworkCredential UseDefaultCredentials的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆