Kolumne: Dino talks

Benutzerdefinierte Prinzipalobjekte in ASP.NET MVC (Teil 2)
Kommentare

Benutzerdefinierte Informationen verarbeiten
Dieser ganze Aufwand wäre ziemlich nutzlos, wenn es keine Möglichkeit gäbe, dem Standardprinzipalobjekt benutzerdefinierte Daten hinzuzufügen. Zunächst

Benutzerdefinierte Informationen verarbeiten

Dieser ganze Aufwand wäre ziemlich nutzlos, wenn es keine Möglichkeit gäbe, dem Standardprinzipalobjekt benutzerdefinierte Daten hinzuzufügen. Zunächst wird ein benutzerdefiniertes Principal wie in Listing 3 erstellt.

Listing 3: Erstellen eines benutzerdefinierten „Principal“
public class MyPrincipal : GenericPrincipal
{
    public MyPrincipal(IIdentity identity, String[] roles) : 
                       base(identity, roles)
    { }

    // Extra properties
    public String PictureName { get; set; }
    public Int32 Balance { get; set; }
}  

Am einfachsten ist es, die neue Klasse von GenericPrincipal abzuleiten und lediglich ein paar zusätzliche Eigenschaften hinzuzufügen, um benutzerdefinierte Daten im Authentifizierungsticket zu speichern. Im letzten Schritt erstellen Sie eine Instanz dieses Prinzipals und ersetzen die User-Eigenschaft im HTTP-Kontext. Dieser Schritt ist für jede Anforderung auszuführen und sollte sich unmittelbar an den Authentifizierungsschritt anschließen. In Listing 4 sehen Sie global.asax.

Listing 4: global.asax
protected void Application_PostAuthenticateRequest()
{
    // Collect current security information 
    var principal = HttpContext.Current.User as RolePrincipal;
    if (principal == null)
        return;
    var identity = principal.Identity as FormsIdentity;
    if (identity == null)
        return;
    var roles = principal.GetRoles();

    // Extract user data in the authentication ticket
    var customInfo = identity.Ticket.UserData;
    var tokens = customInfo.Split('|');

    // Build a richer principal object  
    var myPrincipal = new MyPrincipal(identity, roles)
                      {
                         PictureName = tokens[0]; 
                         Balance = tokens[1].ToInt32()
                      };

    // Store the new principal in the HttpContext
    HttpContext.Current.User = myPrincipal;
}  

In der Regel verwenden Sie diese Technik in einer spezifischen Anwendung, wo es im Allgemeinen sicher ist, Annahmen über den Status der Rollenverwaltung und den Typ der Authentifizierung zu treffen. Im vorliegenden Beispiel wird ein Standardprinzipal vom Typ RolePrincipal und eine FormsIdentity angenommen. Diese Annahmen dienen hauptsächlich dazu, schnell Zugriff auf Rollen- und Identitätsinformationen zu erhalten, die erforderlich sind, um den benutzerdefinierten Prinzipal zu instanziieren. Der neue Prinzipal wird instanziiert und mit benutzerdefinierten Daten, die aus dem Ticket abgerufen werden, gefüllt. Schließlich wird der neue Prinzipal verwendet, um den Wert in der User-Eigenschaft des HttpContext-Objekts zu ersetzen.

Fassen wir zusammen …

Wie können Sie nun per Programm auf den neuen Prinzipal zugreifen? Das geht ganz einfach: Sie wandeln HttpContext.User in MyPrincipal um und erhalten Zugriff auf zusätzliche Eigenschaften. Falls es Sie stört, den Typumwandlungscode immer wieder neu zu schreiben, können Sie auch auf eine Erweiterungsmethode für den IPrincipal-Typ zurückgreifen.

Dino Esposito ist R&D Director bei Crionet, einer Firma, die sich auf webbasierte Lösungen für Sportereignisse in ganz Europa spezialisiert hat. Außerdem ist Dino der Autor von „Programming ASP.NET MVC“, Microsoft Press, 2010.
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -