2010-07-18 3 views
16

Ich möchte in den authentifizierten Benutzern zusätzliche Informationen speichern, so dass ich es (wie User.Identity.Id, zum Beispiel) leicht zugänglich machen kann, anstatt nur den Namen, da ich mit bin die Planung, dass nicht eindeutig.Wie implementiere ich benutzerdefinierte Principal und Identity in ASP.NET MVC?

Bisher habe ich gesammelt, dass ich aussehen soll benutzerdefinierte Auftraggeber und/oder Identität zu implementieren, aber ich bin nicht sicher, wie es geht. Ich habe nach Dokumentation und Tutorials zu diesem Thema gesucht, aber ich habe ähnliche Sachen an verschiedenen Orten gefunden und ich fand es ein wenig verwirrend.

Ich habe gesehen, wie benutzerdefinierte Informationen zum Authentifizierungscookie in der Benutzerdateneigenschaft hinzugefügt werden, aber ich hätte gerne den Vorteil der Abhängigkeitsinjektion für Komponententests, die ich mit dem Prinzipal und der Identität haben kann.

Was sind die genaue Schritte muss ich prüfen, ob ich möchte, dass meine eigene Haupt oder Identität implementieren?

Was die einfachste wäre ich in diesem Szenario tun könnte (nur die ID hinzufügen und alle Standardeinstellungen in Position halten)? "Defaults" würde die Standardanbieter (Mitgliedschaft, Rollen usw.) enthalten.

Ich habe die other question gesehen, aber ich würde gerne Antworten, die keine Lücken dazwischen lassen, wie die Rollen magic strings im AuthenticateRequest-Ereignis in den Beispielen. Stattdessen muss ich wissen, wie ich dem aktuellen Benutzer die Rollen aus dem Standard-SqlRoleProvider hinzufügen kann: wann und wo und wann muss ich etwas anderes tun, um meine neuen Klassen mit den anderen Standardanbietern zu verbinden.

Es wäre fantastisch sein, um zu einer Probe ASP.NET MVC 2 Anwendung zu gehen (von der Bildvorlage Studio 2010, zum Beispiel), um die Änderungen zu machen und nutzen.


EDIT: ich die Frage besser zu zeigen bearbeitet haben, dass ich ziemlich bin verloren hier, also kann ich nicht mit einem zu hohen Niveau Antworten behelfen.

S.S .: Es scheint mir, dass es mehr Sinn macht, die ID in der Identity zu haben, anstatt auf den Principal, obwohl ich das in gewisser Weise bereits gesagt habe.

+0

Haben Sie zur Zeit Formularauthentifizierung und Rollen eingerichtet? –

+0

tue ich. Ich habe mit einer MVC-Webanwendung (im Gegensatz zu einer MVC * Empty * -Webanwendung) aus den VS 2010-Vorlagen begonnen. Daher enthält sie alle Standard-SQL-Anbieter für die Benutzerverwaltung: Mitgliedschaft und Rollen enthalten. Aber das meiste ist hinter Vorhängen gemacht. Durch Konvention, sozusagen –

+0

können Sie nicht einfach die Profile-Unterstützung für diese Art von Sache verwenden? Das ist, was es ist (zusätzliche Daten mit dem Benutzer verbunden) - sollte einfacher sein als zu versuchen, einen "benutzerdefinierten Benutzer" Ich würde denken, –

Antwort

20

Diese Frage gestellt wurde und beantwortet vor: ASP.NET MVC - Set custom IIdentity or IPrincipal

Aber zusammenzufassen ...

Crate eine benutzerdefinierte Hauptklasse mit den zusätzlichen properites Sie speichern möchten:

Public Class CustomPrincipal 
    Inherits System.Security.Principal.GenericPrincipal 

    Private _eyeColor As String 
    Public ReadOnly Property EyeColor As String 
     Get 
      Return _eyeColor 
     End Get 
    End Property 

    Public Sub New(id As System.Security.Principal.IIdentity, roles As String(), eyeColor As String) 
     MyBase.New(id, roles) 
     _eyeColor = eyeColor    
    End Sub 

End Class 

ändern global.asax Global.Application_AuthenticateRequest Ihre benutzerdefinierten Haupt verwenden:

Protected Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As System.EventArgs) 
    ... 
    Dim roles() As String = {"examplerole"}   
    Context.User = new CustomPrincipal(Context.User.Identity, roles, "green") 
End Sub 

dann an anderer Stelle in Ihrem Code, wenn Sie eine dieser Eigenschaften beziehen möchten dies tun:

CType(My.User.CurrentPrincipal, CustomPrincipal).EyeColor 
+0

Seth - Woher bekommst du "grün"? Rufen Sie es bei jeder Application_AuthenticateRequest aus der Datenbank ab? Speichern Sie es in einer Sitzungsvariablen? – mga911

+0

@ mga911 - In diesem Beispiel ist "grün" fest codiert. In einer echten Web-App würde ich es aus der Datenbank lesen und möglicherweise in einem Cookie speichern. Bei zusätzlichen Aufrufen von AuthenticateRequest könnte es aus dem Cookie gelesen werden, um db-Aufrufe zu verhindern. Sitzungsoptionen sind hier keine Option, da AuthenticateRequest vor SessionStart aufgerufen wird. –

2

Sie können wirklich nicht erwarten, dass jemand Sie alles beibringen können Sie über .NET nicht wissen, in ein paar Absätze.Sie können ziemlich gutes Beispiel bei MSDN http://msdn.microsoft.com/en-us/library/system.security.principal.genericprincipal.aspx lesen und durch die Klasse und seine Derivate in Reflector graben - es gibt nichts spektakuläres Besonderes.

Rollen sind nur ein String Array von Namen für den eigenen Gebrauch, in Ihrer App/Server.

Having said that, Sie müssen nicht wirklich auf GenericPrincipal derrivative überhaupt zielen. Check out

HttpContext.Current.Items 

Es ist ein Hashtable zur freien Verwendung nur für die Anfrage Sie Wartung - was bedeutet, dass ein Punkt, an Sie sagen können:

HttpContext.Current.Items["TokenUser"] = new MyThinUser(anything,I,want,there); 

und dann everythere sonst im Code nur tun:

var user = HttpContext.Current.Items["TokenUser"] as MyThinUser; 

und Sie sind fertig.

Speichern Sie in Ihrer neuen Klasse alles, was Sie benötigen, um vom Authentifizierungscode zu allen anderen Funktionen weitergeleitet zu werden. Lässt die Benutzereigenschaft intakt (damit Sie hineinschauen können und nicht befürchten müssen, dass Sie etwas geändert haben). Sie können Ihr System beliebig vereinfachen oder komplizieren, aber Sie behalten die volle Unabhängigkeit.

Zum Beispiel, wenn Sie Ihre eigene Authentifizierung und nur ein paar Ebenen von Zugriffen anstelle von aufgezählten Rollen haben, können Sie einfach gute alte Zugriffsstufen Nummer tragen (aufgezählte Rollen herumgetragen als Strings sowieso sehr ineffizient).

Denken Sie daran, dass autogenisierte Proben in VS in der Regel auf ein bestimmtes Szenario ausgerichtet sind. Wenn Sie SQL-Anbieter für die Benutzerverwaltung sehen, heißt das nicht, dass Sie sie tatsächlich verwenden müssen - Sie können immer noch Ihren eigenen Sproc aufrufen, um das zu bekommen, was Sie von Ihrer eigenen Tabelle in SQL benötigen.

+0

Das ist ein interessanter Ansatz. – Dementic

Verwandte Themen