Aus der Praxis – Aufruf eines WCF aus SharePoint 2013 heraus
avatar

In meinem letzten Artikel habe ich beschrieben, wie man einen WCF Dienst erstellt, mit dem man per Server Object Model auf SharePoint 2013 zugreifen kann. Hier der Link zu dem Artikel.

Nun soll es einen Schritt weiter gehen und wir wollen den WCF Service aus einer SharePoint Anwendung heraus aufrufen. Als einfaches Beispiel nehmen wir ein Webpart, das den Titel eine Website mit Hilfe des Dienstes abruft (dafür benutzen wir die im ersten Artikel bereitgestellt Funktion GetSiteTitle()). Das Hauptaugenmerk soll auch diesmal wieder auf der Authentifizierung und den Anmeldeinformationen liegen.

1. Erstellung eines Webparts

Als wurde ein neues Projekt in Visual Studio für ein SP2013 Visual Webpart erstellt. Der Einfachheit halber nehmen wir dazu eine Farm Solution. Die Anbindung des WCF Service in einer App erfolgt im nächsten Artikel.

In das Projekt fügen wir eine Service Reference ein. Im Webpart selbst wird die Methode dann aufgerufen und der Rückgabewert einfach im Webpart angezeigt.

Da es in diesem Szenario keine Möglichkeit gibt die zugehörigen Informationen für den Endpunkt und dessen Konfiguration per app.config oder web.config mitzuliefern, müssen die Einstellungen im Code vorgenommen werden.

Ebenso möchte ich im Webpart den aktuellen Benutzer anzeigen. Dazu nutze ich wieder die Methode “GetIdentity” aus dem ersten Artikel. Der komplette Codeblock des Webparts sieht dann so aus:

protected void Page_Load(object sender, EventArgs e)
{
    try
    {
        Controls.Add(new LiteralControl("Current identity " + GetIdentity() + "<br />"));                

        BasicHttpBinding binding = new BasicHttpBinding();
        binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
        binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;

        string url = "http://hansevis05b.dev.hansevision.de/SP2013Service.svc";
        EndpointAddress endpoint = new EndpointAddress(url);

        WcfServiceProxy.SP2013ServiceClient client = new WcfServiceProxy.SP2013ServiceClient(binding, endpoint);
        client.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
        client.ChannelFactory.Credentials.Windows.ClientCredential = System.Net.CredentialCache.DefaultNetworkCredentials;

        string siteTitle = client.GetSiteTitle();
        Controls.Add(new LiteralControl("Result from web service is " + siteTitle));
    }
    catch (Exception ex)
    {
        Controls.Add(new LiteralControl(ex.ToString()));
    }
}

2. Webpart deployen und in eine Seite einbinden

Nun platziere ich das Webpart in einer Seite einer Webanwendung, während mit dem WCF Service der Site Title aus einer anderen Webanwendung ausgelesen werden soll. Dieses Szenario mit einem “Umweg” über Webservices kommt immer dann zum Tragen, wenn die Webanwendungen unter verschiedenen Application Pools laufen (was in fast allen Kundenumgebungen der Fall ist).

Das Ergebnis sieht so aus:

image

Der aktuelle Benutzername wird korrekt angezeigt. Das Ergebnis vom WebService hingegen gibt als Informationen folgendes zurück: Aufrufender Benutzer = NT AUTHORITY\IUSR, danach den Benutzer der an SharePoint angemeldet ist (der Application Pool Account des WebService) und den Titel der Website.

Überraschend ist auf den ersten Blick vor allem, dass der Name des angemeldeten Benutzers im Webpart und im WebService unterschiedlich sind. Was passiert hier also genau? Der Benutzerdaten werden beim Aufruf der SharePoint Site korrekt übergeben. Danach erfolgt der Aufruf des WebService, bei dem die Anmeldeinformationen aufgrund der Double Hop-Problematik verloren gehen. Diese lässt sich nur mit dem Einsatz der Kerberos-Authentifizierung umgehen.

 

Im nächsten Artikel dieser kleinen Reihe wird es darum gehen, den erstellen Web Service aus einer SharePoint 2013 App heraus aufzurufen.

Ein Gedanke zu “Aus der Praxis – Aufruf eines WCF aus SharePoint 2013 heraus
avatar

  1. Pingback: Aus der Praxis – Aufruf eines WCF aus SharePoint 2013 heraus - SharePoint Blogs in German - Bamboo Nation

Schreibe einen Kommentar