C# 如何在ClaimsEntity Asp.NetCore中传递对象

C# 如何在ClaimsEntity Asp.NetCore中传递对象,c#,asp.net-core,asp.net-core-webapi,C#,Asp.net Core,Asp.net Core Webapi,如何在Asp.NetCore WebApi中传递JWT声明中的对象和对象。例如,让我们假设我要传递一个具有ID和名称的性别对象 private IActionResult GenerateJwtToken(string email, ApplicationUser user) { var tokenHandler = new JwtSecurityTokenHandler(); var key = Encoding

如何在Asp.NetCore WebApi中传递JWT声明中的对象和对象。例如,让我们假设我要传递一个具有ID和名称的性别对象

        private IActionResult GenerateJwtToken(string email, ApplicationUser user)
        {

            var tokenHandler = new JwtSecurityTokenHandler();
            var key = Encoding.ASCII.GetBytes(appSettings.Secret);
            var tokenDescriptor = new SecurityTokenDescriptor
            {
                Subject = new ClaimsIdentity(new Claim[] 
                {
                    new Claim(ClaimTypes.Name, user.Id.ToString()),
                    new Claim(ClaimTypes.Email, user.Email.ToString()),
                    new Claim(ClaimTypes.GivenName, user.FirstName.ToString()),
                    new Claim(ClaimTypes.UserData, user.LastName.ToString()),
                    new Claim(ClaimTypes.StreetAddress, user.Address.ToString()),
                    new Claim(ClaimTypes.DateOfBirth, user.DateOfBirth.ToString()),
                    new Claim(ClaimTypes.Rsa, user.FileName.ToString()),
                    new Claim(ClaimTypes.Gender, user.Sex.ToString()),
                    new Claim(ClaimTypes.Country, user.Country.ToString()),
                    new Claim(ClaimTypes.StateOrProvince, user.state.ToString()),
                    new Claim(ClaimTypes.Locality, user.LGA.ToString()),
                    new Claim(ClaimTypes.Hash, user.HairColor.ToString()),
                    new Claim(ClaimTypes.Sid, user.GenoType.Name.ToString()),
                    new Claim(ClaimTypes.Spn, user.BloodGroup.ToString()),
                    new Claim(ClaimTypes.System, user.Religion.ToString()),
                    new Claim(ClaimTypes.NameIdentifier, user.NKName.ToString()),
                    new Claim(ClaimTypes.OtherPhone, user.NKPhoneNumber.ToString()),
                    new Claim(ClaimTypes.SerialNumber, user.NKAddress.ToString()),
                    new Claim(ClaimTypes.GroupSid, user.NKRelationship.ToString()),


                }),

                Expires = DateTime.UtcNow.AddDays(7),
                SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
            };


            var token = tokenHandler.CreateToken(tokenDescriptor);
            var tokenString = tokenHandler.WriteToken(token);

            return Ok(new{ token = tokenString });


        }
如果有什么更好的方法来获取当前登录用户的详细信息,除了索赔,我很想知道。提前谢谢

[HttpGet("/api/profile")]
public IActionResult Index()
{
    var claimIdentity = this.User.Identity as ClaimsIdentity;
    IEnumerable<Claim> claims = claimIdentity.Claims;

    var model = new IndexViewModel
    {
        Id = claimIdentity.FindFirst(ClaimTypes.Name).Value,
        Email = claimIdentity.FindFirst(ClaimTypes.Email).Value,
        FirstName = claimIdentity.FindFirst(ClaimTypes.GivenName).Value,
        LastName = claimIdentity.FindFirst(ClaimTypes.UserData).Value,
        Address = claimIdentity.FindFirst(ClaimTypes.StreetAddress).Value,
        DateOfBirth = claimIdentity.FindFirst(ClaimTypes.DateOfBirth).Value,
        FileName = claimIdentity.FindFirst(ClaimTypes.Rsa)?.Value,
    };

    return Ok(model);
}
[HttpGet(“/api/profile”)]
公共IActionResult索引()
{
var claiminentity=this.User.Identity作为ClaimsIdentity;
IEnumerable claims=claimentity.claims;
var模型=新的IndexViewModel
{
Id=claimEntity.FindFirst(ClaimTypes.Name).Value,
Email=claimentity.FindFirst(ClaimTypes.Email).Value,
FirstName=claiminentity.FindFirst(ClaimTypes.GivenName).Value,
LastName=ClaimEntity.FindFirst(ClaimTypes.UserData).Value,
Address=ClaimEntity.FindFirst(ClaimTypes.StreetAddress).Value,
DateOfBirth=ClaimEntity.FindFirst(ClaimTypes.DateOfBirth).Value,
FileName=claimintity.FindFirst(ClaimTypes.Rsa)?.Value,
};
返回Ok(型号);
}

由于声明只能存储字符串值,因此需要将对象表示为字符串。例如,您可以使用nuget包将对象序列化/反序列化为
json
格式。可能是这样的:

string genderStr = JsonConvert.SerializeObject(gender);
// {
//   "Id": 1,
//   "Name": "Male"
// }
Gender genderObj = JsonConvert.DeserializeObject<Gender>(genderStr);
string genderStr=JsonConvert.serialized对象(性别);
// {
//“Id”:1,
//“姓名”:“男性”
// }
Gender genderObj=JsonConvert.DeserializeObject(genderStr);
除了索赔之外,是否有更好的方法获取当前登录的用户详细信息

正如我看到的,您的声明存储在令牌中,可以像您一样从声明中获取它。另一种选择是将用户详细信息存储在某些存储器中,例如数据库。在这种情况下,您需要从声明中获取用户id,并从存储中获取所有详细信息


这两种选择都值得考虑。使用第一个选项,您将增加令牌大小并减少DB请求量。使用第二个选项,您将减小令牌大小并增加DB请求量。

我从声明中获取了用户id,并从存储中获得了如下详细信息

[HttpGet("/api/profile")]
public async Task < IActionResult > Index() {

   var userId = caller.Claims.Single(c => c.Type == ClaimTypes.Name);
   var user = await userManager.Users.Include(s => s.Sex)
              .SingleOrDefaultAsync(c => c.Id == userId.Value);

    return Ok(user);

}    
[HttpGet(“/api/profile”)]
公共异步任务索引(){
var userId=caller.Claims.Single(c=>c.Type==ClaimTypes.Name);
var user=await userManager.Users.Include(s=>s.Sex)
.SingleOrDefaultAsync(c=>c.Id==userId.Value);
返回Ok(用户);
}    

非常感谢,我从声明中获取了用户id,并从存储中获取了所有详细信息。