2009-06-23 7 views
3

Ich bin ganz mit diesem für die letzten 2 Stunden verärgert :(Windows-Authentifizierung mit Basichttpbinding von WCF

Leute,

ich einen Sharepoint-Liste OOTB Web-Service aus einer Konsole-Anwendung zugreifen versuchen. Meine Sharepoint Website in IIS auf integrierte Windows-Auth-Modus und den anonymen Zugriff aktiviert.

nun auf Client-Seite, was ich tue wird wie folgt

try    
{ 
    BasicHttpBinding bind = new BasicHttpBinding(); 
    bind.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly; 
    bind.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows; 
    EndpointAddress endpoint = new EndpointAddress("http://abc:37379/_vti_bin/lists.asmx"); 
    ServiceReference1.ListsSoapClient listService 
     = new ConsoleApplication1.ServiceReference1.ListsSoapClient(bind, endpoint); 
    var elm = listService.GetListItems("Tasks", null, null, null, "10", null, @"06dc3b48-a55e-4db8-8511-acbaf9748e15"); 
} 
catch (Exception ex){ 
    Console.WriteLine("Message:\n" + ex.Message + "\nDetail:\n" + 
    ex.ToString() + "\nStackTrace:\n" + ex.StackTrace); } 

Boom, dies löst die Ausnahme aus "Die HTTP-Anfrage ist nicht autorisiert mit dem Client-Authentifizierungsschema 'Negotiate'. Der Authentifizierungs-Header vom Server empfangen wurde ‚NTLM‘.“

Ich wollte wirklich etwas tun, wie nach dem, was wir im alten Netz 2,0 Tage zu tun verwendet

serviceProxy.Credentials = new NetworkCredentials("username","password","domain"); 

Was ist der einfachste Weg, dies zu erreichen Art der Berechtigungsbehandlung in neuen Proxy-Klassen?

(BTW wie Sie bereits bemerkt habe ich bin der Binding/Endpunkt alles innerhalb Code eher eine Konfigurationsdatei, dies ist eine Einschränkung für meine App. Bitte sagen Sie mir nicht dies zu ändern, ist nicht möglich.)

Kann mir jemand dabei helfen ?? Es würde sehr geschätzt werden.

+0

FYI: Geänderte Thema, weil ASMX <> WCF, so von _course_ sind die Proxy-Klassen unterschiedlich. –

Antwort

3

IIRC Dies passiert, wenn der Webserver versucht, zu ntlm zurückzuschlagen, wenn Sie kerberos (windows) in der Bindung angegeben haben.

Sie sollten in der Lage sein, diese Codezeile

bind.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows; 

zu

bind.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm; 

zu ändern, wenn Sie kerberos müssen dann arbeiten müssen Sie sicherstellen, dass der Dienst auf dem Webserver ist unter demselben Konto ausgeführt wird, wie es im aktiven Verzeichnis für den Namen des Dienstprinzips ist.

Wenn Sie die Anmeldeinformationen angeben möchten, verwenden Sie die Kanalfactory zum Erstellen des Clients, und bevor Sie den Kanal öffnen, legen Sie die entsprechenden Anmeldeinformationen für die Credential-Eigenschaft der Kanalfactory fest. Zum Beispiel:

var cf = new ChannelFactory<IServiceInterface>(
    bind, endpoint); 
cf.Credentials.UserName.UserName = "domain\\someuser"; 
cf.Credentials.UserName.Password = "password"; 
+0

sieht es so aus, als hätte der generierte Proxy auch eine credentials-Eigenschaft, mit der Sie das Gleiche tun können. – jageall

+0

Hallo vielen Dank für Ihre Vorschläge. Leider funktioniert es nicht. :(Sie können meinen Kommentar zu chris.w.mclean oben für eine Beschreibung meines Problems und auch die Ausnahmen sehen, denen ich gegenüberstand. – Moim

+0

funktioniert für mich hier. –