Search code examples
c#asp.netasp.net-mvcasp.net-mvc-5claims

Access Claim values in controller in MVC 5


I have used OWIN authentication in my application.

Login Action

var claims = new List<Claim>();
claims.Add(new Claim(ClaimTypes.Name, result.UserFirstName));            
claims.Add(new Claim(ClaimTypes.Sid, result.UserID.ToString()));
var identity = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie);

I want to access the UserName and UserID from different action. How can I access the values which is added in the claims?

Update I have tried

var claims = new List<Claim>();
claims.Add(new Claim(ClaimTypes.Name, result.UserFirstName + " " + result.UserLastName));            
claims.Add(new Claim(ClaimTypes.Sid, result.UserIDNumber.ToString()));
var identity = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie);
var authenticationManager = Request.GetOwinContext().Authentication;
authenticationManager.SignIn(identity);

var claimsPrincipal = new ClaimsPrincipal(identity);
Thread.CurrentPrincipal = claimsPrincipal;

enter image description here

I can view the values inside the quick window. But even though I couldn't access the value. How to get the value?


Solution

  • You need to set your Thread.CurrentPrincipal after login i.e.

    var claims = new List<Claim>();
    claims.Add(new Claim(ClaimTypes.Name, result.UserFirstName));            
    claims.Add(new Claim(ClaimTypes.Sid, result.UserID.ToString()));
    var identity = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie);
    var claimsPrincipal = new ClaimsPrincipal(identity);
    // Set current principal
    Thread.CurrentPrincipal = claimsPrincipal;
    

    Then the following will retrieve the values.

    //Get the current claims principal
    var identity = (ClaimsPrincipal)Thread.CurrentPrincipal;
    
    // Get the claims values
    var name = identity.Claims.Where(c => c.Type == ClaimTypes.Name)
                       .Select(c => c.Value).SingleOrDefault();
    var sid = identity.Claims.Where(c => c.Type == ClaimTypes.Sid)
                       .Select(c => c.Value).SingleOrDefault();