Können Sie den RolePrincipal in ein benutzerdefiniertes IPrincipal-Objekt einschließen?

Ich verwende benutzerdefinierte Mitgliedschafts- und Rollenanbieter innerhalb des ASP.NET-Frameworks mit Formularauthentifizierung. Diese arbeiten großartig. Der Rollenanbieter verwendet ein Cookie, um die Rollen beizubehalten, und speichert bei jeder Webanforderung eine Reise in die Datenbank. Ich verwende auch die UserData-Zeichenfolge im FormsAuthenticationTicket, um die UserId zu speichern.

Ich muss mein DAL aus dem Webprojekt in ein eigenes Projekt umgestalten. Die DAL hängt davon ab, ob die ID des aktuellen Benutzers abgerufen und die Rollen auf Rechte überprüft werden. Wie sollte sich mein Authentifizierungssystem ändern, damit ich Thread.CurrentPrincipal verwenden kann, ohne auf System.Web im DAL-Projekt zu verweisen?

Gegenwärtig erstellt das Provider-Framework ein RolePrincipal- und ein FormsIdentity-Objekt und hängt es an das Thread.CurrentPrincipal-Objekt an.

Ich dachte darüber nach, einen benutzerdefinierten IPrincipal-Wrapper um den RolePrincipal während des Application_PostAuthenticateRequest-Ereignisses zu erstellen. In diesem Fall kann ich die Benutzer-ID aus dem FormsAuthenticalTicket abrufen und zusammen mit dem RolePrincipal an diesen neuen wrapperPrincipal übergeben.

Ist das ein gültiger Ansatz? Werde ich am Ende Probleme verursachen, wenn ich mich mit der Provider-Struktur herumärgere?

Danke, Keith

<code>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);
    }
}
</code>

Antworten auf die Frage(1)

Ihre Antwort auf die Frage