2016-07-13 76 views
8

Abbiamo scritto un codice molto indietro per chiamare un servizio con credenziali di dominio. Ora i domini vengono modificati e si prevede di utilizzare l'account Windows predefinitoNetworkCredential UseDefaultCredentials not working

Così sto provando a ripristinare le credenziali di rete per un webservice asmx via config. Ho creato una classe SoapExtentsion e provando a eseguire l'override anche se esegue la riga. Ma non viene mai applicata e sempre il codice esistente al di sotto di vincere

codice vero e proprio

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

Nuovo Codice/Config Change solo

pianificazione di iniettare attraverso ulteriori modifiche dll e di configurazione. Quindi la modifica del codice di codice di cui sopra originale non è richiesta/vietato ora

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> 

Uno sa come cambiare dinamicamente le credenziali di rete impiegate per servizi ASMX tramite config?

UPDATE:

Mentre il debug, ho potuto vedere la rete vengono reimpostati credenziali. Ma in qualche modo invia al server quando richiama la richiesta.

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. 

finestra di output:

Vedere l'ultima riga AcquireCredentialsHandle passa authdata. Le credenziali impostate in prxy.Credentials = new System.Net.NetworkCredential("MyAccount", "pwd", "MyDomain") vengono utilizzate anche se la mia estensione di servizio è stata ripristinata.

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

Ho appena fatto un cambiamento di codice per tesing e sotto è differenza nella comunicazione socket

AcquireDefaultCredential(package = NTLM, intent = Outbound) 

Vs

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

Se non ricordo male, il codice di configurazione vince sempre su file di configurazione, in base alla progettazione in .NET Framework. Config viene caricato per primo e, quando il codice viene eseguito, sovrascrive l'impostazione. – Nikki9696

+0

Il mio codice iniettato via config viene eseguito nuovamente e ripristinato il valore. Ma in qualche modo sta già inviando le credenziali. – Billa

risposta

1

Se ho capito correttamente quindi penso che sia necessario aggiungere le chiavi per il tuo Acc ount, nome utente e password in appSettings nel file di configurazione.

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

Dopo che nel codice,

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

Questo è quello che ho attualmente e voglio liberarmi di questo ... La vera domanda è come sbarazzarsi di questo via config. – Billa

+0

Non è possibile sbarazzarsi di questo. –