Custom Identity using MVC5 and OWIN

后端 未结 4 1863
轻奢々
轻奢々 2021-01-30 11:33

I trying to add custom properties to the ApplicationUser for a web site using MVC5 and OWIN authentication. I\'ve read https://stackoverflow.com/a/10524305/264607 and I like ho

4条回答
  •  不要未来只要你来
    2021-01-30 12:09

    I can get something to work using Claims based security, so if you're looking to get something done quickly here is what I have at the moment:

    In the login process in the AccountController (mine is within SignInAsync method), add a new claim to the identity created by UserManager:

    private async Task SignInAsync(ApplicationUser user, bool isPersistent)
    {
        AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
        var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
        identity.AddClaim(new Claim("PatientNumber", user.PatientNumber)); //This is what I added
        AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity);
    }
    

    Then in my base controller classes I simply added a property:

    private string _patientNumber;
    public string PatientNumber
    {
        get
        {
            if (string.IsNullOrWhiteSpace(_patientNumber))
            {
                try
                {
                    var cp = ClaimsPrincipal.Current.Identities.First();
                    var patientNumber = cp.Claims.First(c => c.Type == "PatientNumber").Value;
                    _patientNumber = patientNumber;
                }
                catch (Exception)
                {
                }
            }
            return _patientNumber;
        }
    }
    

    This link was helpful for claims knowledge: http://msdn.microsoft.com/en-us/library/ms734687.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1


    Update for the issue with IPrincipal

    I tracked it down to the Identity property. The issue was that I was providing a default constructor on the PatientPortalPrincipal class that was not setting the Identity property. What I ended up doing was removing the default constructor and calling the correct constructor from within Application_PostAuthenticateRequest, updated code is below

    protected void Application_PostAuthenticateRequest(Object sender, EventArgs e)
    {
        if (HttpContext.Current.User.Identity.IsAuthenticated)
        {
            userManager = new UserManager(new UserStore(new ApplicationDbContext()));
    
            ApplicationUser user = userManager.FindByName(HttpContext.Current.User.Identity.Name);
    
            PatientPortalPrincipal newUser = new PatientPortalPrincipal(user);
            newUser.BirthDate = user.BirthDate;
            newUser.InvitationCode = user.InvitationCode;
            newUser.PatientNumber = user.PatientNumber;
    
            //Claim cPatient = new Claim(typeof(PatientPortalPrincipal).ToString(), );
    
            HttpContext.Current.User = newUser;
        }
    }
    

    That makes the whole thing work!

提交回复
热议问题