2009-03-30 5 views
1

Ich habe einen SOAP-Webdienst auf meiner Sharepoint-Box unter dem _layouts-Verzeichnis und einen Thick-Client, der diesen SOAP-Dienst verwendet. Wir haben eine Sharepoint-Box, die Basic Auth verwendet, und eine andere, die Client-Zertifikate verwendet. Ich brauche diesen SOAP-Dienst, um einige Listenelemente in einer Dokumentbibliothek zu aktualisieren. Das Problem, das ich habe, scheint nichts zu funktionieren, wenn ich nicht innerhalb eines erhöhten Privilegienblocks laufe. Hier ist ein Codeausschnitt von dem, was ich versuche zu tun.SOAP-Webdienst unter SharePoint

using (SPSite site = new SPSite(fileUrl)) 
using (SPWeb web = site.OpenWeb()) { 
    // web.CurrentUser is always null unless in elevated privileges block. 
    // do something with document library... 
    web.Files.Add(...); // fails with access denied unless in elevated privileges block. 
} 

Ich habe auch versucht „SPContext.Current.Web“, aber es gibt null für „web.CurrentUser“ auch wenn ich bin in einer erweiterten Rechten blockieren.

Ich kann wirklich keinen erhöhten Rechteblock verwenden, weil die Benutzer sich beschweren, dass alles, was mein SOAP-Dienst berührt, ein vom System modifiziertes System hat.

Vom Thick-Client wir Code wie folgt verwenden ...

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestString); 
if(basicAuth) { 
    request.Credentials = System.Net.CredentialCache.DefaultCredentials; 
} 
else { 
    X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser); 
    store.Open(OpenFlags.ReadOnly); 
    foreach (X509Certificate2 certificate in store.Certificates) { 
     request.ClientCertificates.Add(certificate); 
} 
request.GetResponse(); 

Wir bauen manuell die SOAP-Anforderung aus verschiedenen Gründen.

+0

Können Sie mehr über die Sicherheit für das Webanwendungsidentitätskonto für Ihren Webservice erklären? – Nat

+0

Ich habe meine Frage aktualisiert. – joegtp

+0

Können Sie die integrierten SharePoint-Webdienste nur für die Listenbearbeitung verwenden? – Zach

Antwort

1

Wenn Sie möchten, dass Ihr Webservice ordnungsgemäß in den Sharepoint-Kontext integriert wird (dh den "aktuellen Sharepoint-Benutzer" abfragen kann), sollten Sie ihn in _vti_bin (dem ISAPI-Unterordner des 12 hyve) implementieren, nicht in _layouts .

Die Erkennung ist ein wenig mühsam und erfordert eine manuelle Anpassung der Dateien (siehe the MSDN article on custom webservices within SharePoint für weitere Informationen), aber da Sie Ihre Anfrage trotzdem manuell erstellen, sollte die Entdeckung kein Problem sein.

[Bearbeiten] Als Alternative können Sie versuchen, die SPUserToken der Fenster authentifizierten Benutzer zu erwerben,

SPUserToken token = web.AllUsers[WindowsIdentity.GetCurrent().Name].UserToken; 

und dann diesen Token verwenden, um die Website und Web als diesen Benutzer zu öffnen.