Я пытаюсь добавить пользовательские свойства к ApplicationUser для веб-сайта с использованием аутентификации MVC5 и OWIN. Я читал qaru.site/info/13508/..., и мне нравится, как он интегрируется с базовым контроллером для легкого доступа к новым свойствам. Моя проблема в том, что когда я устанавливаю свойство 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, поскольку я, кажется, реализовал все, что ему нужно.