Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden
+49 (0) 351/850 33-0

Sharepoint 2007 Masterpage Unterscheidung für Gäste und Nutzer

Steht man vor der Aufgabe einen Sharepoint optisch anpassen zu müssen, ist oft die Masterpage anzupassen. Wird der Sharepoint lediglich als interner Portalserver verwendet, welcher nur von einer bestimmten Zielgruppe genutzt wird, reicht dazu meist das Anlegen einer eigenen Masterpage aus.

In einem aktuellen Projekt stand ich jedoch vor dem Problem, Gästen sowie Administratoren jeweils eine eigene Masterpage zur Verfügung zu stellen. Sharepoint selber bietet keine Möglichkeit zu unterscheiden ob gerade ein Gast oder ein Nutzer auf eine Seite zugreift und eine entsprechende Masterpage auszuliefern.

Auf der Suche nach einer Lösung im Internet wurde ich relativ schnell fündig, jedoch funktionierten die angebotenen Lösungen nicht für Publishing Pages oder Template Redirection Pages.

Um die Masterpage dynamisch für Publishing Pages zu ändern, verwendet man die nachfolgende Eigenschaft:

SPContext.Current.Web.CustomMasterUrl

Die nächste Eigenschaft kann nur verwendet werden, wenn es sich nicht um Publishing Pages handelt oder man die „application.master“ verändern will.

page.MasterPageFile = "/_catalogs/masterpage/default.master"

Auf Basis dieser Informationen kann nun ein Skript geschrieben werden, welches abhängig davon ob ein Nutzer angemeldet ist oder nicht, die Masterpage setzen kann. Als Ergänzung dazu kann innerhalb der „page_PreInit“ die application.master auf eine eigene Masterpage eingestellt werden.

Alles was man dazu tun muss, ist, sich ein neues dll Projekt anzulegen und die fertig kompilierte dll in dem Global Assembly Cache abzulegen. Dabei ist es wichtig die dll zu signieren.

using System;
using System.Web;
using System.Web.UI;
using System.IO;
using Microsoft.SharePoint.Publishing;
using Microsoft.SharePoint;

public class MasterPageSwitch : IHttpModule
{
        public void Init(HttpApplication context)
        {
            context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute);
        }

     void context_PreRequestHandlerExecute(object sender, EventArgs e)
        {
            Page page = HttpContext.Current.CurrentHandler as Page;

            if (page is PublishingLayoutPage || page is TemplateRedirectionPage)
            {
                HttpApplication currentApp = sender as HttpApplication;
                string parameter = "";
                if (HttpContext.Current.User.Identity.IsAuthenticated)
                {
                    parameter = "/_catalogs/masterpage/adminMaster.master";
                }
                else
                {
                    parameter = "/_catalogs/masterpage/guestMaster.master";
                }
                if (parameter != null)
                {
                    SPContext.Current.Web.CustomMasterUrl = parameter;
                }
            }
            else
            {
                if (page != null)
                    page.PreInit += new EventHandler(page_PreInit);
            }
        }

         void page_PreInit(object sender, EventArgs e)
        {
            Page page = sender as Page;
            if (page != null)
            {
                if (page.MasterPageFile != null)
                {
                    if (page.MasterPageFile.Contains("application.master"))
                    {
                      //auskommentiert da wir die Änderung der application.master nicht benötigen
                      //page.MasterPageFile = "/_catalogs/masterpage/default.master";
                    }
                }
            }
        }

        public void Dispose()
        {
        }
}

Als letzten Schritt fügt man innerhalb der web.config unter der Sektion folgenden Eintrag hinzu :

<add name="MasterPageSwitch" type="MasterPageSwitch, MasterPageSwitch, Version=1.0.0.0, Culture=neutral, PublicKeyToken=................"/>

Kommentar hinterlassen


Pin It on Pinterest