Squeak.ru - шаблоны программирования

Срок действия токена обновления истек, как только токен доступа

Я реализую токен обновления JWT и устанавливаю другое время истечения срока действия для токена обновления, но время истечения срока его действия совпадает с токеном доступа.

var refreshTokenId = Guid.NewGuid().ToString("n");
DateTime refreshTokenLifeTime = context.OwinContext.Get<DateTime>("as:clientRefreshTokenLifeTime");

Чтобы сохранить в базе данных

RefreshToken refreshToken = new RefreshToken();
refreshToken.Token = refreshTokenId;
refreshToken.PrivateKey = context.SerializeTicket();
refreshToken.ExpiryDate = refreshTokenLifeTime;

Завершить сохранение Db

context.Ticket.Properties.IssuedUtc = DateTime.Now;
context.Ticket.Properties.ExpiresUtc = refreshTokenLifeTime;

context.SetToken(refreshTokenId);
context.SetToken(context.SerializeTicket());

Любая помощь, что я делаю неправильно?


  • Где в предоставленном коде вы устанавливаете разные сроки действия? Я вижу, что в этом коде два времени истечения установлены на одно и то же значение. 22.12.2017
  • Это для токена обновления 22.12.2017
  • Пожалуйста, добавьте логику для вашего токена доступа. Если время одинаковое, нам нужно увидеть оба токена. 26.12.2017
  • Можете ли вы написать весь код реализации для IAuthenticationTokenProvider в своем вопросе? 28.12.2017
  • Похоже, Ур использует одни и те же refreshTokenLifeTime оба токена. 02.01.2018

Ответы:


1

Токен обновления не продлевает срок действия, это называется скользящим сроком действия, и вы не можете сделать это с токенами доступа. Я использовал токен обновления для обновления ролей пользователей, а не времени истечения срока действия. Проверьте это Link для Slidingexpiration Я использовал приведенный ниже код для обновления токена и его сохранения.

  public class SimpleRefreshTokenProvider : IAuthenticationTokenProvider
{

    public async Task CreateAsync(AuthenticationTokenCreateContext context)
    {
        var clientid = context.Ticket.Properties.Dictionary["as:client_id"];

        if (string.IsNullOrEmpty(clientid))
        {
            return;
        }

        var refreshTokenId = Guid.NewGuid().ToString("n");

        using (AuthRepository _repo = new AuthRepository())
        {
            var refreshTokenLifeTime = context.OwinContext.Get<string>("as:clientRefreshTokenLifeTime"); 

            var token = new RefreshToken() 
            { 
                Id = Helper.GetHash(refreshTokenId),
                ClientId = clientid, 
                Subject = context.Ticket.Identity.Name,
                IssuedUtc = DateTime.UtcNow,
                ExpiresUtc = DateTime.UtcNow.AddMinutes(Convert.ToDouble(refreshTokenLifeTime)) 
            };

            context.Ticket.Properties.IssuedUtc = token.IssuedUtc;
            context.Ticket.Properties.ExpiresUtc = token.ExpiresUtc;

            token.ProtectedTicket = context.SerializeTicket();

            var result = await _repo.AddRefreshToken(token);

            if (result)
            {
                context.SetToken(refreshTokenId);
            }

        }
    }

    public async Task ReceiveAsync(AuthenticationTokenReceiveContext context)
    {

        var allowedOrigin = context.OwinContext.Get<string>("as:clientAllowedOrigin");
        context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { allowedOrigin });

        string hashedTokenId = Helper.GetHash(context.Token);

        using (AuthRepository _repo = new AuthRepository())
        {
            var refreshToken = await _repo.FindRefreshToken(hashedTokenId);

            if (refreshToken != null )
            {
                //Get protectedTicket from refreshToken class
                context.DeserializeTicket(refreshToken.ProtectedTicket);
                var result = await _repo.RemoveRefreshToken(hashedTokenId);
            }
        }
    }
}

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

public override Task GrantRefreshToken(OAuthGrantRefreshTokenContext context)
    {
        var originalClient = context.Ticket.Properties.Dictionary["as:client_id"];
        var currentClient = context.ClientId;

        if (originalClient != currentClient)
        {
            context.SetError("invalid_clientId", "Refresh token is issued to a different clientId.");
            return Task.FromResult<object>(null);
        }

        // Change auth ticket for refresh token requests
        var newIdentity = new ClaimsIdentity(context.Ticket.Identity);
        newIdentity.AddClaim(new Claim("newClaim", "newValue"));

        var newTicket = new AuthenticationTicket(newIdentity, context.Ticket.Properties);
        context.Validated(newTicket);

        return Task.FromResult<object>(null);
    }
27.12.2017
  • Что не так с моим кодом, тот же код, я вставил только логику токена обновления 27.12.2017
  • Та же логика реализована, поэтому каждый раз, когда вы создаете токен обновления, также будет генерироваться токен обновления, поэтому, если вы используете более длительный срок действия токена обновления. 27.12.2017
  • пожалуйста, проверьте ответ еще раз, я обновил его, чтобы он был более удобным 27.12.2017
  • Это же я реализовал. Вы проверили, что ваш токен обновления остается дольше, чем токен доступа, в соответствии с вашим кодом и моим кодом, когда срок действия токена доступа истекает, мы используем токен обновления для повторной генерации токена доступа, в этот момент токен обновления также обновляется и генерирует новый токен обновления 28.12.2017
  • О, я думаю, вы ошиблись, токен обновления не предназначен для продления срока действия, это называется скользящим сроком действия, и вы не можете сделать это с токенами доступа. Я использовал токен обновления для обновления ролей пользователей, а не времени истечения срока действия. 28.12.2017
  • проверьте эту ссылку, может помочь stackoverflow. ком/вопросы/42330013/ 28.12.2017

  • 2

    Это не правильно

    DateTime refreshTokenLifeTime = context.OwinContext.Get<DateTime>("as:clientRefreshTokenLifeTime");
    

    вы читаете время жизни, а не устанавливаете для него какое-либо новое значение.

    02.01.2018
  • context.Ticket.Properties.ExpiresUtc = refreshTokenLifeTime;... ЗДЕСЬ я устанавливаю значение 03.01.2018
  • @Md.ParvezAlam, который вы только что прочитали из контекста Овина. Вы нигде не генерируете значение токена av (в предоставленном вами образце кода). 04.01.2018
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...