Пользовательский стиль с использованием MVC5 и OWIN
Я пытаюсь добавить пользовательские свойства в ApplicationUser для веб-сайта с использованием аутентификации MVC5 и OWIN. я прочелhttps://stackoverflow.com/a/10524305/264607 и мне нравится, как он интегрируется с базовым контроллером для быстрого доступа к новым свойствам. Моя проблема в том, что, когда я устанавливаю свойство HTTPContext.Current.User в свой новый IPrincipal, я получаю нулевую ссылку:
[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
Вот мой код:
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; }
}
Я не нашел много документации о том, как это сделать, я прочитал эти статьи:
Комментарии во второй ссылке указали мне на использование претензий (http://msdn.microsoft.com/en-us/library/ms734687.aspx?cs-save-lang=1&cs-lang=csharp), но статья, на которую ссылаются, не показывает, как добавить их вIPrincipal
(который является то, чтоHttpContext.Current.User
есть), или где в конвейере вы должны добавить их вClaimsIdentity
(который является конкретным классомUser
является). Я склоняюсь к использованию утверждений, но мне нужно знать, где добавить эти новые утверждения пользователю.
Даже если претензии являются подходящим способом, мне любопытно, что я делаю неправильно с моим пользовательским IPrincipal, поскольку я, кажется, реализовал все, что требуется.