Identidad personalizada con MVC5 y OWIN
Intento agregar propiedades personalizadas al ApplicationUser para un sitio web usando la autenticación MVC5 y OWIN. he leídohttps://stackoverflow.com/a/10524305/264607 y me gusta cómo se integra con el controlador base para facilitar el acceso a las nuevas propiedades. Mi problema es que cuando configuro la propiedad HTTPContext.Current.User en mi nuevo IPrincipal obtengo un error de referencia nulo:
[NullReferenceException: Object reference not set to an instance of an object.]
System.Web.Security.UrlAuthorizationModule.OnEnter(Object source, EventArgs eventArgs) +127
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +136
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +69
Aquí está mi código:
protected void Application_PostAuthenticateRequest(Object sender, EventArgs e)
{
if (HttpContext.Current.User.Identity.IsAuthenticated)
{
userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
ApplicationUser user = userManager.FindByName(HttpContext.Current.User.Identity.Name);
PatientPortalPrincipal newUser = new PatientPortalPrincipal();
newUser.BirthDate = user.BirthDate;
newUser.InvitationCode = user.InvitationCode;
newUser.PatientNumber = user.PatientNumber;
//Claim cPatient = new Claim(typeof(PatientPortalPrincipal).ToString(), );
HttpContext.Current.User = newUser;
}
}
public class PatientPortalPrincipal : ClaimsPrincipal, IPatientPortalPrincipal
{
public PatientPortalPrincipal(ApplicationUser user)
{
Identity = new GenericIdentity(user.UserName);
BirthDate = user.BirthDate;
InvitationCode = user.InvitationCode;
}
public PatientPortalPrincipal() { }
public new bool IsInRole(string role)
{
if(!string.IsNullOrWhiteSpace(role))
return Role.ToString().Equals(role);
return false;
}
public new IIdentity Identity { get; private set; }
public WindowsBuiltInRole Role { get; set; }
public DateTime BirthDate { get; set; }
public string InvitationCode { get; set; }
public string PatientNumber { get; set; }
}
public interface IPatientPortalPrincipal : IPrincipal
{
WindowsBuiltInRole Role { get; set; }
DateTime BirthDate { get; set; }
string InvitationCode { get; set; }
string PatientNumber { get; set; }
}
No he encontrado mucha documentación sobre cómo hacer esto, he leído estos artículos:
Los comentarios en el segundo enlace me señalaron que tal vez use reclamos (http://msdn.microsoft.com/en-us/library/ms734687.aspx?cs-save-lang=1&cs-lang=csharp), pero el artículo vinculado a no muestra cómo agregarlos a unIPrincipal
(Que es queHttpContext.Current.User
es), o en qué lugar de la tubería se supone que debes agregarlos a unClaimsIdentity
(que es la clase concreta delUser
es). Me estoy inclinando hacia el uso de reclamos, pero necesito saber dónde agregar estos nuevos reclamos al usuario.
Incluso si las reclamaciones son el camino a seguir, tengo curiosidad por saber qué estoy haciendo mal con mi IPrincipal personalizado, ya que parece que he implementado todo lo que requiere.