Получите заявки пользователей непосредственно из ClaimsIdentity, используя JWT - PullRequest
0 голосов
/ 07 мая 2019

PS.Я попытался показать код всех упомянутых методов и классов, поэтому проверьте также ниже.

Следуя логике из этой статьи о JWT, я создал один TokenManager.cs класс, который генерирует и проверяет Json Web Tokens.Я создал один класс JwtAuthorizeActionFilter.cs , который является атрибутом ActionFilterAttribute с методом OnActionExecutingAsync, который ищет токен авторизации в заголовках запроса и проверяет его.Я использую этот атрибут над каждым методом, который я хочу работать с 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;

Вот так я получаю их, используя OAuth с атрибутом Authorize.Можно ли получить такие претензии?Без необходимости реализовывать Овина.Прямо сейчас я получаю их следующим образом:

            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);
        }

Найдено в Token Manager.

        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, авторизовать атрибуты - и сделать это проще с моей пользовательской аутентификацией)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...