Пользовательский стиль с использованием 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://blogs.msdn.com/b/webdev/archive/2013/10/16/customizing-profile-information-in-asp-net-identity-in-vs-2013-templates.aspx

http://blogs.msdn.com/b/webdev/archive/2013/07/03/understanding-owin-forms-authentication-in-mvc-5.aspx

Комментарии во второй ссылке указали мне на использование претензий (http://msdn.microsoft.com/en-us/library/ms734687.aspx?cs-save-lang=1&cs-lang=csharp), но статья, на которую ссылаются, не показывает, как добавить их вIPrincipal (который является то, чтоHttpContext.Current.User есть), или где в конвейере вы должны добавить их вClaimsIdentity (который является конкретным классомUser является). Я склоняюсь к использованию утверждений, но мне нужно знать, где добавить эти новые утверждения пользователю.

Даже если претензии являются подходящим способом, мне любопытно, что я делаю неправильно с моим пользовательским IPrincipal, поскольку я, кажется, реализовал все, что требуется.

Ответы на вопрос(4)

Ваш ответ на вопрос