Регенерировать токен-носитель JWT при каждом запросе API

#asp.net-web-api #jwt

#asp.net-web-api #jwt

Вопрос:

Я хочу регенерировать свой токен-носитель при каждом запросе, отправляемом на сервер.

Я не хочу использовать токен обновления для этой цели.

Может кто-нибудь, пожалуйста, посоветовать, как я могу регенерировать новый токен с новым штампом истечения срока действия из ранее сгенерированного токена, который передается через заголовок авторизации?

Комментарии:

1. С какой целью, если можно спросить?

Ответ №1:

Вызывайте конечную точку токена сервера авторизации каждый раз, прежде чем отправлять запрос API.

Комментарии:

1. Я не хочу делать дополнительный запрос. Я пытаюсь генерировать токен при каждом вызове веб-сервера, и новый токен будет отправляться в ответном промежуточном сообщении. Я ищу токен скользящего истечения срока действия

2. хорошо, используемые вами слова предполагают OAuth 2.0, отсюда и мой ответ; кажется, вы хотите сделать что-то другое, кроме стандартного

3. Я сделал что-то идентичное тому, что вы предлагаете, но вместо того, чтобы вызывать endpoint каждый раз, когда я делал общий ответ при каждом вызове API, который будет иметь новый токен с расширенным сроком действия

Ответ №2:

Я создал фильтр MessageHandler, наследующий от класса DelegatingHandler, и перезаписал метод SendAsync.

Я могу получить доступ к моему исходному токену-носителю, полученному из запроса здесь, который я могу декодировать и сгенерировать новый. После генерации нового я добавляю его в ответ, чтобы он выполнялся при каждом запросе, и нам не нужно управлять отдельным API

         string audienceId = Properties.Settings.Default.AudienceId;
        var issuer = Properties.Settings.Default.AngularHostURL;
        string symmetricKeyAsBase64 = Properties.Settings.Default.AudienceSecret;

        DateTime IssuedUtc = DateTime.UtcNow;
        DateTime ExpiresUtc = 
        IssuedUtc.AddMinutes(Properties.Settings.Default.TokenLifetimeInMinutes);
        var keyByteArray = TextEncodings.Base64Url.Decode(symmetricKeyAsBase64);
        var signingKey = new HmacSigningCredentials(keyByteArray);

        var identity = new ClaimsIdentity("JWT");

        foreach (var claim in claims)
            identity.AddClaim(claim);

        var tokennew = new JwtSecurityToken(issuer, audienceId, identity.Claims, 
        IssuedUtc, ExpiresUtc, signingKey);
        var handler = new JwtSecurityTokenHandler();
        var jwt = handler.WriteToken(tokennew);

        return jwt;