Czy możesz zawinąć RolePrincipal w niestandardowy obiekt IPrincipal?

Używam niestandardowych dostawców członkostwa i ról w środowisku ASP.NET z uwierzytelnianiem formularzy. Te działają świetnie. Dostawca ról wykorzystuje plik cookie do utrwalania ról, zapisując podróż do bazy danych przy każdym żądaniu internetowym. Używam również ciągu UserData wewnątrz FormsAuthenticationTicket do przechowywania UserId.

Muszę zmienić mój DAL z projektu internetowego na własny projekt. DAL jest zależny od pobierania identyfikatora bieżącego użytkownika, a także sprawdzania ról dla praw. Jak powinien się zmienić mój system uwierzytelniania, aby móc korzystać z Thread.CurrentPrincipal bez odwoływania się do System.Web w projekcie DAL?

Obecnie struktura dostawcy tworzy obiekt RolePrincipal i FormsIdentity i dołącza go do obiektu Thread.CurrentPrincipal.

Pomyślałem o utworzeniu niestandardowego opakowania IPrincipal wokół RolePrincipal podczas zdarzenia Application_PostAuthenticateRequest. W tym przypadku mogę uzyskać identyfikator użytkownika z biletu FormsAuthenticalTicket i przekazać go do tego nowego opakowaniaPrincipal wraz z RolePrincipal.

Czy to poprawne podejście? Czy skończę, powodując pewne problemy w projekcie, zakłócając strukturę dostawcy?

Dziękuję, 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>

questionAnswers(1)

yourAnswerToTheQuestion