2016-04-29 107 views
14

Ho un servizio WCF ho creato in un WebApplication con la seguente configurazione nel file web.configCome DefaultNetworkCredentials il passaggio al servizio WCF

<service name="RedwebServerManager.WebApplication.DesktopService" 
      behaviorConfiguration="ServBehave"> 
    <endpoint 
     address="" 
     binding="basicHttpBinding" 
     bindingConfiguration="basicBind" 
     contract="RedwebServerManager.WebApplication.IDesktopService"/> 
    </service> 
</services> 
<bindings> 
    <basicHttpBinding> 
    <binding name="basicBind"> 
     <security mode="TransportWithMessageCredential"> 
     <transport clientCredentialType="Windows"/> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 

Questo servizio ha bisogno di prendere in WindowsCredentials in per ottenere informazioni in un database basato sull'utente autenticato. Questa corrente servizio ha un metodo di implementazione di un'interfaccia con la seguente firma

[ServiceContract] 
public interface IDesktopService 
{ 
    /// <summary> 
    /// Gets the clients. 
    /// </summary> 
    /// <returns>IEnumerable&lt;ClientServiceModel&gt;.</returns> 
    [OperationContract] 
    IEnumerable<ClientServiceModel> GetClients(); 
} 

Ho un Windows Form, che sta consumando il servizio WCF e voglio passare attraverso le credenziali dell'utente corrente utilizzando l'applicazione in quanto ciò stare tutti seduti sul nostro dominio. L'app.config è la seguente

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
      <binding name="BasicHttpBinding_IDesktopService"> 
       <security mode="TransportWithMessageCredential"> 
       <transport clientCredentialType="Windows" proxyCredentialType="Windows"/> 
       </security> 
      </binding> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="https://redwebservermanager.redweb.network/DesktopService.svc" 
      binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IDesktopService" 
      contract="ManagerService.IDesktopService" name="BasicHttpBinding_IDesktopService" /> 
    </client> 
</system.serviceModel> 

Se ho impostato manualmente le credenziali di nome utente e password tutto funziona correttamente comunque ho cercato

managerService.ClientCredentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials 

modo che io possa passare le credenziali degli utenti attuali sopra ma io continua a ricevere un errore nella chiamata a GetClients() che il nome utente e la password non sono impostati.

Qualcuno può aiutarmi? Ho anche provato ad aggiungere

[OperationBehavior(Impersonation = ImpersonationOption.Required)] 

al metodo ma questo non ha fatto differenza.

+0

So che sembra sciocco, ma hai provato ** non impostando ** 'ClientCredential' affatto. Stiamo usando 'NetTcpBinding' con sicurezza di trasporto e il lavoro sopra indicato per noi. –

risposta

6

È possibile ottenere il nome utente (e più informazioni tranne la password) utilizzando uno dei seguenti modi:

//1. 
System.Security.Principal.WindowsIdentity.GetCurrent(); 
//2.  
AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal); 
    WindowsPrincipal user = (WindowsPrincipal)System.Threading.Thread.CurrentPrincipal; 
//3.  
WindowsIdentity ident = WindowsIdentity.GetCurrent(); 
    WindowsPrincipal user = new WindowsPrincipal(ident); 

Ma, non c'è modo si può accedere alla password dell'utente. Si prega di fare riferimento a questa question

Dopo aver ricevuto le informazioni di identità, è possibile passare il nome utente per WCF utilizzando OutgoingMessageHeaders, come:

MessageHeader<string> header = new MessageHeader<string>(userName); 
     OperationContextScope contextScope = new OperationContextScope(InnerChannel); 
     OperationContext.Current.OutgoingMessageHeaders.Add(
     header.GetUntypedHeader("String", "System")); 

E nella implementazione del servizio WCF si può leggere come:

OperationContext context = OperationContext.Current; 

      if (context != null) 
      { 
       try 
       { 
        _LoginName = OperationContext.Current.IncomingMessageHeaders.GetHeader<string>("String", "System");   
       } 
       catch 
       { 
        _LoginName = string.Empty; 
       } 
      } 

Per favore fatemi sapere se questo aiuta o se avete altre domande.

Grazie, Soma.