如何从.netcore

时间:2018-10-27 06:02:58

标签: .net-core jwt asp.net-core-2.0 asp.net-core-webapi

这是我用于生成令牌的代码:

            var claims = new List<Claim>
            {
                new Claim(ClaimTypes.NameIdentifier, appUser.Id.ToString()),
                new Claim(ClaimTypes.Name, appUser.UserName)
            };

            var roles = await _userManager.GetRolesAsync(user);

            foreach (var role in roles)
            {
                claims.Add(new Claim(ClaimTypes.Role, role));
            }


            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config.GetSection("AppSettings:Token").Value));

            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha512Signature);

            string issuer = _config["Token:Issuer"];

            var jwtSecurityToken = new JwtSecurityToken(
                issuer: issuer,
                audience:issuer,
                claims: claims,
                expires: DateTime.Now.AddMinutes(5),
                signingCredentials: new SigningCredentials(key, SecurityAlgorithms.HmacSha256)
            );

            jwtSecurityToken.Header.Add("kid", requestAPIKey);
            var token = new JwtSecurityTokenHandler().WriteToken(jwtSecurityToken);

令牌输出以下内容:

{
  "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier": "7",
  "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name": "ligeros",
  "exp": 1540619440,
  "iss": "http://localhost:5000",
  "aud": "http://localhost:5000"
}

我怎样才能使其输出呢?

{
  "nameid": "7",
  "unique_name": "ligeros",
  "nbf": 1540613190,
  "exp": 1540703190,
  "iat": 1540613190
}

我不在乎nbf,exp和iat。我只希望删除URL并使其成为nameid,unique_name,而不是http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifierhttp://schemas.xmlsoap.org/ws/2005/05/identity/claims/name。谢谢你!

2 个答案:

答案 0 :(得分:1)

这很有用,但是并不能完全解决我的问题,该问题是由于某些jwt声明映射到.net声明而引起的,因此在此堆栈溢出中发现以下信息:Get short claim type name < / p>

在“关于”页面上检查声明时,您会注意到两件事:有些声明的类型名长于奇数,而且声明中的声明超出了您的应用程序所需。

长声明名称来自Microsoft的JWT处理程序,试图映射 .NET的ClaimTypes类类型的某些声明类型。你可以关掉 下面的代码行(在“启动”中)会出现这种情况。

这还意味着您需要调整以下配置 针对新的唯一子声明类型的反CSRF保护:

解决方法是在身份配置之前将其添加到您的启动中

JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary<string, string>();

对于较新版本的IdentityModel,该属性称为DefaultInboundClaimTypeMap:

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

答案 1 :(得分:0)

我修复了它:

            var claims = new List<Claim>
            {
                new Claim("nameid", appUser.Id.ToString()),
                new Claim("unique_name", appUser.UserName)
            };

            var roles = await _userManager.GetRolesAsync(user);

            foreach (var role in roles)
            {
                claims.Add(new Claim("roles", role));
            }