Как обменять токен авторизации на стороне сервера - PullRequest
0 голосов
/ 03 октября 2018

У меня есть веб-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();
    }
}

Чтоправильный синтаксис?Или я лаю не на том дереве, и есть совершенно лучший способ достичь своей цели?

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Оказалось довольно просто.Все, что мне нужно было сделать в методе ValidateToken(), это создать новый ClaimsPrincipal, используя ClaimsIdentity, который я реконструировал на основе сериализованных утверждений, которые я сохранил в базе данных:

  ... // create claimsIdentity from serialized claims
  context.Principal = new ClaimsPrincipal(claimsIdentity);
  context.Success();
}

Только одинна что следует обратить внимание: при первоначальном входе в систему обязательно возвращать Subject претензию, поэтому в методе HandleTokenRequest() нам по-прежнему необходимо:

identity.AddClaim(new Claim(OpenIdConnectConstants.Claims.Subject, user.Username));
0 голосов
/ 03 октября 2018

Существующее промежуточное программное обеспечение для аутентификации заполняет заявки на ClaimsPrincipal на основе содержимого JWT, но к тому времени, когда ваши обработчики авторизации проверяют заявки, которые они не читают непосредственно из токена, нет необходимости изменятьсам знак

Вы должны иметь возможность доступа и изменения утверждений текущего пользователя (HttpContext.User) из промежуточного программного обеспечения, чтобы вы могли создать пользовательское промежуточное программное обеспечение , которое выполняется после промежуточного программного обеспечения аутентификации и добавляет утверждения на основерезультаты поиска в базе данных.

Редактировать: Как указывает Шол в своем ответе, это также можно сделать с помощью метода Validate ваших компонентов аутентификации.Это действительно хорошее место, чтобы сделать это в этом случае.Отдельное промежуточное программное обеспечение (как я описал) сработало бы, если бы вы хотели, чтобы «перевод» заявок на заявки из базы данных был отделен от процесса аутентификации.Ключевым моментом является то, что ASP.NET Core хранит заявки пользователей в ClaimsPrincipal объектах, и вам просто нужно обновить их, а не беспокоиться о самом токене.

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