JWT How to add custom claims and decode claims
If you want to gets claims i.e, preferred_username
you can get that from ClaimsPrincipal.
var user = User as ClaimsPrincipal;
string username = user.Claims.Where(c => c.Type == "preferred_username")
.Select(x => x.Value).FirstOrDefault();
User
will come from Claims
. For that write
using System.Security.Claims;
It seems that User
is not available in all versions. Another way to get claims will be something similar.
var prinicpal = (ClaimsPrincipal)Thread.CurrentPrincipal;
var email = prinicpal.Claims.Where(c => c.Type == ClaimTypes.Email)
.Select(c => c.Value).SingleOrDefault();
Assign all the values for AuthenticationDTO
.
public AuthenticationDTO DecodeToken(String Input)
{
var key = Encoding.ASCII.GetBytes(HostConfig.SecurityKey);
var handler = new JwtSecurityTokenHandler();
var tokenSecure = handler.ReadToken(Input) as SecurityToken;
var validations = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidateIssuer = false,
ValidateAudience = false
};
var claims = handler.ValidateToken(Input, validations, out tokenSecure);
var prinicpal = (ClaimsPrincipal)Thread.CurrentPrincipal;
if (principal is ClaimsPrincipal claims)
{
return new ApplicationDTO
{
Id = claims.Claims.FirstOrDefault(x => x.Type == "sub")?.Value ?? "",
UserName = claims.Claims.FirstOrDefault(x => x.Type == "preferred_username")?.Value ?? "",
Email = claims.Claims.FirstOrDefault(x => x.Type == "email")?.Value ?? ""
};
}
return null;
}
JianYA
Updated on September 23, 2020Comments
-
JianYA over 3 years
I am trying to retrieve some custom claims that I made when I created my token. However, I am not sure on what I should write to retrieve those claims.
This is my token creation function
public String createToken(AuthenticationDTO Input) { //Set issued at date DateTime issuedAt = DateTime.UtcNow; //set the time when it expires DateTime expires = DateTime.UtcNow.AddDays(7); //http://stackoverflow.com/questions/18223868/how-to-encrypt-jwt-security-token var tokenHandler = new JwtSecurityTokenHandler(); //create a identity and add claims to the user which we want to log in ClaimsIdentity claimsIdentity = new ClaimsIdentity(new[] { new Claim("UserName", Input.UserName), new Claim("Email",Input.Email), new Claim("PhoneNumber",Input.PhoneNumber), new Claim("FirstName",Input.FirstName), new Claim("LastName",Input.LastName), new Claim("Id",Input.Id) }); const string sec = HostConfig.SecurityKey; var now = DateTime.UtcNow; var securityKey = new SymmetricSecurityKey(System.Text.Encoding.Default.GetBytes(sec)); var signingCredentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256Signature); //create the jwt var token =(JwtSecurityToken) tokenHandler.CreateJwtSecurityToken(issuer: HostConfig.Issuer, audience: HostConfig.Audience, subject: claimsIdentity, notBefore: issuedAt, expires: expires, signingCredentials: signingCredentials); var tokenString = tokenHandler.WriteToken(token); return tokenString; }
Instead of using the standard ones that are provided, I decided to name my own claims. However, I do not know how to retrieve them. This is what I have currently:
public AuthenticationDTO DecodeToken(String Input) { var key = Encoding.ASCII.GetBytes(HostConfig.SecurityKey); var handler = new JwtSecurityTokenHandler(); var tokenSecure = handler.ReadToken(Input) as SecurityToken; var validations = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(key), ValidateIssuer = false, ValidateAudience = false }; var claims = handler.ValidateToken(Input, validations, out tokenSecure); return null; }
EDIT:
I noticed that my claims are coming in like this
How can I extract them?
EDIT2:
Added AuthentcationDTO
public class AuthenticationDTO { public String Id { get; set; } public String UserName { get; set; } public String Email { get; set; } public String FirstName { get; set; } public String LastName { get; set; } public String PhoneNumber { get; set; } }