В веб-интерфейсе API, который я создаю, есть некоторые контроллеры, у которых есть действия, которые получают jwttoken от React в качестве параметра, пример этого показан ниже.
public async Task<IActionResult> post(string token)
{
if (!string.IsNullOrEmpty(token))
{
IJsonSerializer serializer = new JsonNetSerializer();
IDateTimeProvider provider = new UtcDateTimeProvider();
IJwtValidator validator = new JwtValidator(serializer, provider);
IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder);
var jsonDecoded = decoder.Decode(token);
var jwtObject = JsonConvert.DeserializeObject<JwtToken>(jsonDecoded);
//do some business logic
}
Многие методы имеют один и тот же код, дублирующийся для проверки токена путем его расшифровки, а затем продолжения со своей ответственностью.
Я создал фильтр аутентификации
public class AuthenticateFilter : Attribute,IActionFilter
{
public void OnActionExecuted(ActionExecutedContext context)
{
throw new NotImplementedException();
}
public void OnActionExecuting(ActionExecutingContext context)
{
IJsonSerializer serializer = new JsonNetSerializer();
IDateTimeProvider provider = new UtcDateTimeProvider();
IJwtValidator validator = new JwtValidator(serializer, provider);
IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder);
var token = context.HttpContext.Request.QueryString.HasValue ? context.HttpContext.Request.QueryString.Value.Substring(7):String.Empty;
var jsonDecoded = decoder.Decode(token);
var jwtObject = JsonConvert.DeserializeObject<JwtToken>(jsonDecoded);
}
}
Я зарегистрировал этот фильтр в startup.cs
services.AddMvc(
options =>
{
options.Filters.Add(new AuthenticateFilter());
options.Filters.Add(typeof(AuthenticateFilter));
}
).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
Я использую библиотеку для декодирования токена.
https://github.com/jwt-dotnet/jwt
после декодирования токена в фильтре я десериализую строку json в класс .net, который показан ниже.
public class JwtToken
{
[JsonProperty("sub")]
public Guid Sub { get; set; }
[JsonProperty("aud")]
public string Aud { get; set; }
}
как я могу получить доступ к объекту
var jwtObject = JsonConvert.DeserializeObject<JwtToken>(jsonDecoded);
во всех действиях контроллера, где я украшаю атрибут.
На заметку Есть ли лучший способ решить эту проблему, предложения приветствуются.