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