使用JWT直接从ClaimsIdentity获取用户声明

时间:2019-05-07 14:40:40

标签: c# .net jwt identity

PS。我试图显示所有提到的方法和类的代码,因此也请在下面检查。

按照article中有关JWT的逻辑,我创建了一个 TokenManager.cs 类,该类生成并验证Json Web令牌。我制作了一个 JwtAuthorizeActionFilter.cs 类,它是一个带有OnActionExecutingAsync方法的ActionFilterAttribute,它在请求标头中搜索Authorization令牌并对其进行验证。我在要使用JWT的每种方法上方使用此属性。到目前为止一切顺利-一切正常。我的问题是如何从控制器中的JWT获得索赔:

var username = RequestContext.Principal.Identity.Name;
var email = (RequestContext.Principal.Identity as ClaimsIdentity).FindFirst(ClaimTypes.Email).Value;
var telephone = (RequestContext.Principal.Identity as ClaimsIdentity).FindFirst("Telephone").Value;

这是我如何使用带有Authorize属性的OAuth来获取它们。是否有可能获得这样的索赔?无需实施Owin。现在,我可以通过以下方式获得它们:

            var token = TokenManager.GetJwtTokenFromHeader();
            var claims = TokenManager.GetPrincipal(token);
            var username = claims.Identity.Name;

我在此方法中不喜欢的是,我需要从请求标头中获取令牌,然后将其传递给TokenManager,然后从中选择所需的内容。

以下是一些提到的课程:

 public static string GenerateToken(string username)
        {
            byte[] key = Convert.FromBase64String(Secret);
            SymmetricSecurityKey securityKey = new SymmetricSecurityKey(key);
            SecurityTokenDescriptor descriptor = new SecurityTokenDescriptor
            {
                Subject = new ClaimsIdentity(new[]
                {
                      new Claim(ClaimTypes.Name, username),
                      new Claim(ClaimTypes.Email, "test@test.com"),
                }),
                Expires = DateTime.UtcNow.AddMinutes(60),
                SigningCredentials = new SigningCredentials(securityKey,
                SecurityAlgorithms.HmacSha256Signature)
            };

            JwtSecurityTokenHandler handler = new JwtSecurityTokenHandler();
            JwtSecurityToken token = handler.CreateJwtSecurityToken(descriptor);
            return handler.WriteToken(token);
        }

在令牌管理器中找到。

        public static ClaimsPrincipal GetPrincipal(string token)
        {
            try
            {
                var tokenHandler = new JwtSecurityTokenHandler();
                var jwtToken = tokenHandler.ReadToken(token) as JwtSecurityToken;

                if (jwtToken == null)
                    return null;

                var symmetricKey = Convert.FromBase64String(Secret);

                var validationParameters = new TokenValidationParameters()
                {
                    RequireExpirationTime = true,
                    ValidateIssuer = false,
                    ValidateAudience = false,
                    IssuerSigningKey = new SymmetricSecurityKey(symmetricKey)
                };

                SecurityToken securityToken;
                var principal = tokenHandler.ValidateToken(token, validationParameters, out securityToken);

                return principal;
            }

            catch (Exception)
            {
                //should write log
                return null;
            }
        }

我的猜测是,如果不实现OAuth / Owin并使JWT成为首选的令牌标准,则无法实现。 (很乐意在没有Owin的情况下执行此操作,授权属性-并通过我的自定义身份验证使其更简单)

0 个答案:

没有答案