c# - usuarios - Recuperar el ID del usuario registrado actualmente en una biblioteca de clase fuera de una aplicación ASP.NET Webforms utilizando la autenticación de formularios
login en asp net vb (2)
Actualmente en cada una de mis clases modelo estoy haciendo lo siguiente en el constructor.
public Product()
{
CreatedBy = System.Threading.Thread.CurrentPrincipal.Identity.Name;
ModifiedBy = System.Threading.Thread.CurrentPrincipal.Identity.Name;
}
De esta forma, al guardar / actualizar registros, estos valores siempre se establecerán.
Sin embargo, quiero cambiar mi aplicación de usar el nombre del usuario registrado que me da el anterior para utilizar el Id del usuario conectado.
Con la autenticación de formularios, ¿cuál es la mejor manera de recuperar datos adicionales sobre el usuario registrado actualmente sin utilizar Session? Me di cuenta de que puede pasar datos adicionales al crear la cookie de autenticación de formularios tan pronto como el usuario inicie sesión, pero no tendría idea de cómo recuperarla.
Aquí está la solución que se me ocurrió. Agradecería cualquier comentario o sugerencia. Resulta extraño que cada vez que creo uno de estos objetos modelo en la interfaz de usuario necesito pasar el ID de usuario en el constructor:
public abstract class AuditableEntity : BaseEntity
{
public DateTime CreatedDate { get; set; }
public int? CreatedBy { get; set; }
public DateTime ModifiedDate { get; set; }
public int? ModifiedBy { get; set; }
}
public class Product : AuditableEntity
{
public User(int userId)
{
this.CreatedBy = userId;
this.ModifiedBy = userId;
}
public string ProductName { get; set; }
public string SerialNumber { get; set; }
}
Al autenticar a un usuario, usted puede usar FormsAuthenticationTicket para pasarle toda la información de las cookies y datos de usuario adicionales (cadenas), aquí hay un ejemplo , luego recupérelo de la siguiente manera:
FormsIdentity id = (FormsIdentity)User.Identity;
FormsAuthenticationTicket ticket = id.Ticket;
//those are label ids, that why they have Text property
cookiePath.Text = ticket.CookiePath;
expireDate.Text = ticket.Expiration.ToString();
expired.Text = ticket.Expired.ToString();
isPersistent.Text = ticket.IsPersistent.ToString();
issueDate.Text = ticket.IssueDate.ToString();
name.Text = ticket.Name;
userData.Text = ticket.UserData; // string userData you passed is HERE
version.Text = ticket.Version.ToString();
Por cierto, debe usar HttpContext.Current.User.Identity.Name
, eche un vistazo a esto y esto tal vez esta pregunta .
Mencionaste que tienes muchas clases que tienen estas propiedades CreatedBy y ModifiedBy.
Pídales que implementen una interfaz:
interface IAuditableEntity
{
int CreatedBy {get; set;}
int ModifiedBy {get; set;}
}
public class Product : IAuditableEntity
{
public string ProductName { get; set; }
public string SerialNumber { get; set; }
public int CreatedBy {get; set;}
public int ModifiedBy {get; set;}
}
public class Vendor : IAuditableEntity
{
public string VendorName{ get; set; }
public string VendorNumber { get; set; }
public int CreatedBy {get; set;}
public int ModifiedBy {get; set;}
}
Cree una ubicación centralizada en su aplicación web responsable de comunicarse con el BLL que establece estas propiedades para usted.
public class BllLink
{
public static void SaveEntity(IAuditableEntity entity)
{
entity.ModifiedBy = HttpContext.Current.User.Identity.Name;
if(String.IsNullOrEmpty(entity.CreatedBy)) //assume new
{
entity.CreatedBy = HttpContext.Current.User.Identity.Name;
}
Bll.SaveEntity(entity); //you might need to use generics
}
}
Cuando ves código repetitivo, es un buen candidato para la simplificación. Aprender cómo utilizar efectivamente los genéricos y las interfaces lo ayudará a lograrlo.