2009-06-15 21 views
3

Ich muss einen Webdienst aufrufen, der in einer Windows-Domäne ausgeführt wird, die sich von der unterscheidet, auf der der (Windows Forms) -Client ausgeführt wird. Der Webdienst wird mithilfe der Windows-Authentifizierung gesichert.So rufen Sie einen Webdienst mit gespeicherten Anmeldeinformationen auf?

Die Domänenanmeldeinformationen für die Domäne des Webdienstes werden im Benutzerprofil des Clients gespeichert (gespeicherte Benutzernamen und Kennwörter in XP), aber ich konnte nicht herausfinden, wie diese gespeicherten Anmeldeinformationen beim Aufruf des Webdiensts verwendet werden. Ich habe viele Beispiele gefunden mit

WebService1.Credentials = System.Net.CredentialCache.DefaultCredentials 

(dies nicht funktioniert, weil es die Anmeldeinformationen für die lokale Domäne ist)

oder

WebService1.Credentials = new NetworkCredentials(username, pwd, domain) 

(waren der Benutzername, Passwort, Domäne sind fest codiert).

Ich habe über die Verwendung CredEnumerate und CredRead mit dem Windows-API lesen, aber nicht wissen, wie (oder ob) ich ein PCREDENTIAL auf einen verwaltetes umwandeln kann NetworkCredential (ReadCred wird nicht zurückkehren Passwörter für gespeicherte Domänenanmeldeinformationen)

Kann jemand hier auf SO wissen, wie man das macht?

Danke!

Antwort

1

OK, fand ich eine Lösung also werde ich meine eigene Frage beantworten: dass

Zuerst fand ich durch die neuen WCF-style-Proxy-Klasse „Service Reference“ ermöglicht es Ihnen, die Sicherheit zu setzen Einstellungen in der app.config-Datei. Der Schlüssel (in meinem Szenario) ist der Modus für den Transport Anmeldeinformationen nur zu setzen, geben Sie Windows als Typen, und die Domäne im Bereich Attribut identifizieren:

<system.serviceModel> 
     <bindings> 
      <basicHttpBinding> 
       <binding name="Service1Soap" closeTimeout="00:01:00" openTimeout="00:01:00" 
        receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" 
        bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
        maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
        messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
        useDefaultWebProxy="true"> 
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
         maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
        <security mode="TransportCredentialOnly"> 
         <transport clientCredentialType="Windows" realm="mydomain.com" /> 
        </security> 
       </binding> 
      </basicHttpBinding> 
     </bindings> 
     <client> 
      <endpoint address="http://server.mydomain.com/HelloWorldSvc/Service1.asmx" 
       binding="basicHttpBinding" bindingConfiguration="Service1Soap" 
       contract="ServiceReference1.Service1Soap" name="Service1Soap" /> 
     </client> 
    </system.serviceModel> 

Next I Hernan de Lahitte's ausgezeichnete wrapper für die CredUIPromptForCredentials API-Funktion verwendet den Benutzer für ihre Anmeldeinformationen aufgefordert, wenn eine Sicherheitsausnahme ausgelöst wird, und speichern sie in ihrem Profil:

ServiceReference1.Service1SoapClient c = new Service1SoapClient(); 
retry: 
try 
{ 
    MessageBox.Show(this, c.HelloWorld()); 
} 
catch (System.ServiceModel.Security.MessageSecurityException securityException) 
{ 
    UserCredentialsDialog creds = new UserCredentialsDialog("*.mydomain.com", "My App", 
                     "Enter your enterprise credentials. Enter your user name as \"MyDomain\\username\""); 
    creds.Flags = UserCredentialsDialogFlags.Persist; 
    if (creds.ShowDialog() == DialogResult.OK) 
    { 
     goto retry; 
    } 
} 

c.Close(); 

Ja, das ist ein „goto“. **** GASP **** :)

1

Ich glaube nicht, dass Sie sie direkt verwenden können. Ich glaube, dass Sie den Benutzer für sie auffordern müssen, und wenn der Benutzer sie einmal bereitstellt, können Sie erneut bestätigen. Here is an article on how to do that. Wenn Sie nur die Anmeldedaten von der DPAPI abholen könnten, würde das den Zweck zunichte machen. :)

Hier sind einige Informationen. falls es hilft ...

Der Manager, der die Daten in der DPAPI enthält, heißt Key Manager. Sie können den Schlüssel-Manager von der Benutzeroberfläche zugreifen, indem Sie eine Start- tun> run ...

rundll32.exe keymgr.dll, KRShowKeyMgr 

Im Allgemeinen ist die API für die der Ort, an dem die Authentifizierungsfunktionen gespeichert ist ADVAPI32. Sie können möglicherweise etwas darin finden, um Ihnen zu helfen. Hier ist ein decent article auf dieser API.

Wenn Sie Ihre Anmeldeinformationen zum CredentialCache hinzufügen, können Sie auch versuchen, authType "Negotiate" als described here.

Entschuldigung, dies ist nur eine Forschungsdump - Ich habe keinen Platz gefunden, aber hoffentlich hilft Ihnen das. GL.

0

Das glaube ich nicht, dass Sie sie in Code verwenden können, afaik Ihre einzigen Optionen sind:

  1. hartzucodieren den Benutzernamen/Passwort ist, wie Sie (in den meisten Fällen ein großes no-no) geschrieben haben.
  2. Einrichten von Kerberos mit Vertrauensstellung zwischen Domänen und Computern, sodass das Domänenkonto der Benutzer den Dienst aufrufen kann.
Verwandte Themen