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