¿Puede envolver el RolePrincipal en un objeto IPrincipal personalizado?

Estoy utilizando los proveedores personalizados de membresía y rol dentro del marco ASP.NET con autenticación de formularios. Estos están funcionando muy bien. El proveedor de funciones está utilizando una cookie para conservar las funciones, guardando un viaje a la base de datos en cada solicitud web. También estoy usando la cadena UserData dentro de FormsAuthenticationTicket para almacenar el ID de usuario.

Necesito refactorizar mi DAL fuera del proyecto web a su propio proyecto. El DAL depende de la recuperación de la ID del usuario actual y de la verificación de los roles para los derechos. ¿Cómo debería cambiar mi sistema de autenticación para poder usar Thread.CurrentPrincipal sin hacer referencia a System.Web en el proyecto DAL?

Actualmente, Provider Framework crea un objeto RolePrincipal y FormsIdentity y lo adjunta al Thread.CurrentPrincipal.

Pensé en crear un contenedor IPrincipal personalizado alrededor del RolePrincipal durante el evento Application_PostAuthenticateRequest. En este caso, puedo obtener el ID de usuario de FormsAuthenticalTicket y pasarlo a este nuevo wrapperPrincipal junto con el RolePrincipal.

¿Es este un enfoque válido? ¿Terminaré causando algunos problemas más adelante en el proyecto al meterme con la estructura del Proveedor?

Gracias 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>

Respuestas a la pregunta(1)

Su respuesta a la pregunta