2012-04-11 17 views
4

Ich verwende benutzerdefinierte Mitgliedschafts- und Rollenanbieter innerhalb des ASP.NET-Frameworks mit Formularauthentifizierung. Diese funktionieren großartig. Der Rollenanbieter verwendet einen Cookie, um die Rollen persistent zu machen und eine Reise in die Datenbank bei jeder Webanfrage zu speichern. Ich verwende auch die UserData-Zeichenfolge innerhalb des FormsAuthenticationTicket, um die UserId zu speichern.Können Sie das RolePrincipal in einem benutzerdefinierten IPrincipal-Objekt umbrechen?

Ich muss meine DAL aus dem Web-Projekt zu einem eigenen Projekt umgestalten. Die DAL ist abhängig vom Abrufen der ID des aktuellen Benutzers sowie von der Überprüfung der Rollen für Rechte. Wie sollte sich mein Authentifizierungssystem ändern, damit ich das Thread.CurrentPrincipal verwenden kann, ohne System.Web im DAL-Projekt zu referenzieren?

Derzeit erstellt das Provider-Framework ein RolePrincipal- und FormsIdentity-Objekt und fügt es dem Thread.CurrentPrincipal an.

Ich dachte darüber nach, einen benutzerdefinierten IPrincipal-Wrapper um das RolePrincipal während des Application_PostAuthenticateRequest-Ereignisses zu erstellen. In diesem Fall kann ich die UserID von FormsAuthentalTicket abrufen und sie zusammen mit dem RolePrincipal an diesen neuen WrapperPrincipal übergeben.

Ist dies ein gültiger Ansatz? Wird es am Ende einige Probleme im Projekt geben, indem ich mich mit der Provider-Struktur herumärbe?

Danke, Keith

protected void Application_PostAuthenticateRequest() 
{ 
    if (Request.IsAuthenticated) 
    { 
     FormsIdentity identity = (FormsIdentity)User.Identity; 

     if (identity != null) 
     { 
      FormsAuthenticationTicket ticket = identity.Ticket; 

      int id = 1; 

      if (identity != null) 
      { 
       int.TryParse(identity.Ticket.UserData, out id); 
      } 

      var wrapperPrincipal = new WrapperPrincipal(User, id); 
      System.Threading.Thread.CurrentPrincipal = WrapperPrincipal; 
     } 
    } 
} 



[Serializable] 
public class WrapperPrincipal : IPrincipal 
{   
    private IPrincipal principal; 

    public WrapperPrincipal(IPrincipal principal, int userId) 
    { 
     this.principal = principal; 
     this.Id = userId; 
    } 

    public int Id { get; set; } 

    public IIdentity Identity 
    { 
     get { return principal.Identity; } 
    } 

    public bool IsInRole(string role) 
    { 
     return principal.IsInRole(role); 
    } 
} 
+0

Ich habe ein paar Zweifel und ich bin wirklich interessiert am Ergebnis Ihrer Frage. Können Sie Ihre Schlussfolgerung teilen, wenn Sie zu irgendeinem gekommen sind? –

+0

Erweitern Sie einfach Ihr WrapperPrincipal mit RolePrincipal, statt IPrincipal zu verwenden, und entfernen Sie die IPrimin-Implementierungsmethoden und -eigenschaften. Das RolePrincipal implementiert IPrincipal – user357086

Antwort

0

ich auf diese Frage kam vor kurzem, als ich versuchte zu benutzerdefinierten Haupt zu implementieren. Ich habe auch Wrapper und ich denke, es ist gültig. Es funktioniert perfekt mit Lukes Ansatz in ASP.NET MVC - Set custom IIdentity or IPrincipal. Sie können nichts durcheinander bringen, weil es nur Wrapper ist, Sie nur Ursprung Hauptmitglieder Delegete, Sie nicht einmal berühren. Ich würde es clevere Lösung nennen.