2016-04-29 7 views
14

ich einen WCF-Dienst habe ich in einem WebApplication mit folgenden Konfiguration in web.config erstellt habeErster DefaultNetworkCredentials zu WCF-Dienst, um durch

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

Dieser Dienst in in WindowsCredentials nehmen muss Informationen in einem bekommen Datenbank basierend auf dem authentifizierten Benutzer. Dieser Service Strom hat eine Methode, um eine Schnittstelle mit der folgenden Signatur

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

Implementierung habe ich eine Windows Forms-Anwendung, die den WCF-Dienst verbraucht und ich mag durch die Anmeldeinformationen des aktuellen Benutzers zu übergeben mit der Anwendung als dieser Wille alle sitzen auf unserer Domäne. Die app.config ist als

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

folgt Wenn ich manuell an die Anmeldeinformationen Benutzernamen und Passwort funktioniert alles richtig aber ich

managerService.ClientCredentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials 

so, dass ich die aktuellen Benutzer-Anmeldeinformationen über, aber ich passieren kann versucht haben, Beim Aufruf von GetClients() bleibt ein Fehler erhalten, dass Benutzername und Passwort nicht gesetzt sind.

Kann mir jemand helfen? Ich habe auch versucht,

zu der Methode hinzuzufügen, aber das machte keinen Unterschied.

+0

Ich weiß, es klingt albern, aber haben Sie versucht ** nicht ** ClientCredential 'überhaupt einstellen. Wir verwenden 'NetTcpBinding' mit Transportsicherheit und das obige funktioniert für uns. –

Antwort

6

Sie können den Benutzernamen erhalten (und andere Informationen als das Passwort) mit einer der folgenden Möglichkeiten:

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

Aber es gibt keine Möglichkeit, das Passwort des Benutzers zugreifen kann. Bitte auf diese question

Sobald Sie die Identitätsinformationen erhalten, können Sie den Benutzernamen WCF OutgoingMessageHeaders geben, wie:

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

Und in der WCF-Service-Implementierung können Sie es gerne lesen:

OperationContext context = OperationContext.Current; 

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

Bitte lassen Sie mich wissen, wenn dies hilft oder wenn Sie weitere Fragen haben.

Vielen Dank, Soma.