簡體   English   中英

C# Owin 處理 401 訪問令牌錯誤並使用刷新令牌重新生成訪問令牌

[英]C# Owin handle 401 access token errors and regenerate access tokens using refresh token

我是這個論壇的新手,我希望專家能提供很多幫助,我們有一個在 C# 中實現 OWIN 身份驗證的項目,並且我們有用於 UI 的內部工具(舊的 angular 語言,javascript)似乎有很多缺陷,以下是一些問題。

  1. 如果訪問令牌過期並且有訪問受保護資源的調用,這里調用將不會完成,那么我們如何使調用完成后使用刷新令牌生成新的訪問令牌,這需要在 UI 或服務端處理,任何代碼指針?

  2. 在 UI 中的訪問令牌到期間隔之前使用刷新令牌生成訪問令牌是一種好習慣嗎?

  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)我不能真正提供任何代碼指針,因為我不知道您的 Angular 版本,但到目前為止我所做的方式是為您的請求提供某種攔截器。 它會查找來自 API 的任何未授權狀態代碼,緩存請求,嘗試命中刷新令牌端點,如果刷新請求成功,則使用新的訪問令牌重新發送緩存的請求,如果刷新請求失敗,請用戶再次驗證。

您還可以嘗試實現一個攔截器,該攔截器檢查訪問令牌到期日期並在剩余 5 分鍾有效期時點擊刷新令牌端點。

2)我會說刷新令牌通常用於已經過期的訪問令牌。

3) 我不知道您對這些 Windows 服務有多少控制權,但據我所知,刷新令牌流應該在客戶端處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM