C# Owin обрабатывает ошибки 401 токена доступа и восстанавливает токены доступа, используя refre sh токен - PullRequest
0 голосов
/ 12 апреля 2020

Я новичок в этом форуме и ожидаю большой помощи от экспертов, у нас есть проект, в котором аутентификация OWIN реализована в C#, и у нас есть внутренний инструмент для пользовательского интерфейса (на старом языке angular, javascript), кажется, много fl aws, ниже приведены некоторые проблемы.

  1. Если токен доступа истек и есть вызов для доступа к защищенному ресурсу, здесь вызов выигран не завершено, так как мы можем сделать этот вызов завершенным после генерации нового токена доступа с использованием токена refre sh, это нужно обрабатывать в пользовательском интерфейсе или на стороне службы, любые указатели кода?

  2. Рекомендуется ли создавать токен доступа с помощью refre sh токена до истечения интервала истечения срока действия токена доступа в пользовательском интерфейсе?

  3. API также используются службой windows, поэтому, если срок действия токена истекает и сервис ударит любой API с токеном с истекшим сроком действия, который он выбрасывает неавторизованным, однако тот же вопрос, как создать токен на лету и завершить этот вызов.

Любая помощь в этом, Буду очень признателен, так что, ожидая ваших ответов, пример кода показан ниже.

 public class SimpleRefreshTokenProvider : IAuthenticationTokenProvider
    {
       private static ConcurrentDictionary<string, AuthenticationTicket> _refreshTokens = new ConcurrentDictionary<string, AuthenticationTicket>();

        public async Task CreateAsync(AuthenticationTokenCreateContext context)
        {
            var guid = Guid.NewGuid().ToString();


            _refreshTokens.TryAdd(guid, context.Ticket);

            // hash??
            context.SetToken(guid);
        }

        public async Task ReceiveAsync(AuthenticationTokenReceiveContext context)
        {
            AuthenticationTicket ticket;

            if (_refreshTokens.TryRemove(context.Token, out ticket))
            {
                context.SetTicket(ticket);
            }
        }

        public void Create(AuthenticationTokenCreateContext context)
        {
            throw new NotImplementedException();
        }

        public void Receive(AuthenticationTokenReceiveContext context)
        {
            throw new NotImplementedException();
        }
    }

    // Now in my Startup.Auth.cs
    OAuthOptions = new OAuthAuthorizationServerOptions
    {
        TokenEndpointPath = new PathString("/api/token"),
        Provider = new ApplicationOAuthProvider(PublicClientId,UserManagerFactory) ,
        AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
        AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(2),
        AllowInsecureHttp = true,
        RefreshTokenProvider = new RefreshTokenProvider() // This is my test
    };

1 Ответ

0 голосов
/ 12 апреля 2020

1) Я не могу предоставить какие-либо указатели кода, так как я не знаю вашу Angular версию, но способ, которым я делал это до сих пор, заключается в использовании своего рода перехватчика для ваших запросов. Он ищет любые неавторизованные коды состояния, поступающие от API, кэширует запрос, пытается выполнить поиск конечной точки токена refre sh и повторно отправляет кэшированный запрос с новым токеном доступа, если запрос refre sh был успешным, если refre sh запрос не выполнен, попросите пользователя снова пройти аутентификацию.

Можно также попытаться реализовать перехватчик, который проверяет дату истечения срока действия токена доступа и достигает конечной точки токена refre sh, если у нее осталось 5 минут срока действия.

2) Я бы скажем, что токены refre sh обычно используются для токенов доступа с истекшим сроком действия.

3) Я не знаю, насколько вы контролируете эти Windows Сервисы, но, насколько мне известно, refre sh поток токенов должен обрабатываться на стороне клиента.

...