У меня есть веб-API ASP.Net Core 2.1, использующий аутентификацию OAuth.Кроме того, мы используем проверку подлинности на основе утверждений, причем утверждения закодированы в токене аутентификации.
Некоторое время это работало хорошо, но в последнее время все вышло из-под контроля, когда появилось новое требование, которое радикально увеличило количество заявок, которые должны были быть сохранены в токене.Короче говоря, мы сейчас находимся в точке, когда токен аутентификации настолько длинный, что нам пришлось перенастроить наш сервер, чтобы разрешить заголовки более 128 КБ.
Это явно несостоятельно;просто с точки зрения сетевого трафика абсурдно отправлять более 100 тыс. заголовков вместе с простейшим GET-запросом.Итак, теперь я подумываю о следующем: вместо того, чтобы кодировать утверждения в токене, просто используйте токен Guid и сохраните утверждения в базе данных вместе с токеном, поэтому, когда мы проверяем токен, мыможет одновременно извлекать заявки и обмениваться ими локально.
Теоретически это должно решить все наши проблемы одним махом, но я просто застрял в деталях реализации, а именно: поскольку основано на утвержденияхаутентификация ожидает найти утверждения, закодированные в токене авторизации, как мне заменить токен Guid auth на тот, который включает все утверждения?
Существующий код:
public class MyAuthenticationEvents : OAuthValidationEvents
{
public override async Task ValidateToken(ValidateTokenContext context)
{
if (context.Properties.ExpiresUtc < DateTime.UtcNow)
{
context.Fail("Access Token has expired.");
return;
}
if (!await TokenIsValidAsync(context)) // code to validate the auth token against the database, could be modified to return claims
{
context.Fail("Access Token has not been properly set or has been invalidated.");
return;
}
// Here I would expect to do some skullduggery to switch the compact Guid token for a large token containing claims
context.Success();
}
}
Чтоправильный синтаксис?Или я лаю не на том дереве, и есть совершенно лучший способ достичь своей цели?