JWT How to add custom claims and decode claims(JWT 如何添加自定义声明和解码声明)
问题描述
我正在尝试检索我在创建令牌时所做的一些自定义声明.但是,我不确定我应该写什么来检索这些声明.
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.
这是我的令牌创建函数
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;
}
我注意到我的索赔是这样来的
I noticed that my claims are coming in like this
如何提取它们?
添加了 AuthentcationDTO
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; }
}
推荐答案
如果你想获取声明,即 preferred_username,你可以从 ClaimsPrincipal 获取.
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 将来自 Claims.对于那个写
User will come from Claims. For that write
使用 System.Security.Claims;
似乎 User 并非在所有版本中都可用.获得索赔的另一种方法是类似的.
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();
为 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;
}
这篇关于JWT 如何添加自定义声明和解码声明的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:JWT 如何添加自定义声明和解码声明
基础教程推荐
- Moq It.Is<>不匹配 2022-01-01
- 如果有人提交恶意软件Nuget包怎么办? 2022-01-01
- .NET SerialPort DataReceived 事件未触发 2022-01-01
- 当值可以是对象或空数组时反序列化 JSON 2022-01-01
- C# 从 List<List<int>> 中删除重 2022-01-01
- WPF 模态进度窗口 2022-01-01
- 禁止输入少量字符,例如'<'、'&a 2022-01-01
- 我应该在后面的代码中直接使用 Linq To SQL 还是使 2022-01-01
- Azure Functions:CosmosDBTrigger 未在 Visual Studio 中触发 2022-01-01
- 如何使用 .Net 检查 Active Directory 服务器是否已启动并正在运行? 2022-01-01
