簡體   English   中英

無法使 Azure B2C 引用令牌失效

[英]Cannot make Azure B2C refersh token become invalid

當用戶在移動設備上使用 MSAL 庫從 Azure B2C 注銷時,這只會清除本地緩存。 服務器上的遠程 session 仍然存在,這意味着仍然可以使用任何現有的刷新令牌。

通過搜索我知道可以使用 Microsoft Graph API 來撤銷當前用戶在 session 中的登錄,從而使所有當前刷新令牌無效。 我相信我正在這樣做,但刷新令牌保持活躍。

這是我的流程:

我為用戶 A 獲得了一個令牌(我使用身份驗證代碼流和 ROPC 進行了嘗試,但我認為這不會有所作為)。

我確認我可以使用 Postman 調用中返回的當前刷新令牌來獲取新的訪問令牌 -

{{b2c_login_url}}/B2C_1_ROPC_SignIn/oauth2/v2.0/token?grant_type=refresh_token&client_id={{b2c_ropc_client_id}}&refresh_token=xxxxx&scope={{b2c_scopes}}&redirect_uri={{b2c_api_redirect_uri}}

這將按預期返回一個新的訪問令牌。

然后我獲取 azure userId 值(訪問令牌中的“oid”屬性)並將其傳遞給我的 API,然后運行以下代碼。

        var graphClient = GetGraphClient();
           
        var result = await graphClient.Users["{" + userId + "}"]
            .RevokeSignInSessions()
            .Request()
            .PostAsync();

        return result.GetValueOrDefault();

我可以看到這個表達式的結果是真的。 我還可以將 go 放到 Azure B2C 用戶詳細信息上,並看到“StsRefreshTokensValidFrom”已按預期更新為當前日期時間。

B2C 用戶審核詳情

現在,我運行與之前使用刷新令牌運行的完全相同的 http 請求以獲取另一個訪問令牌,但這次它應該會失敗。 但是,我繼續獲得新的訪問令牌。

奇怪的是,我確信我之前測試過這個,試圖獲得一個新的令牌,但它失敗了,正如我所期望的那樣。 但現在它總是會返回我新的令牌。

我覺得我在這里遺漏了一些東西。 有什么建議嗎?

我試圖在我的環境中重現相同的結果並得到以下結果:

我通過Postman使用ROPC flow為 B2C 用戶生成令牌,參數如下:

POST https://<tenant_name>.b2clogin.com/<tenant_name>.onmicrosoft.com/<policy>/oauth2/v2.0/token
client_id : xxxxx-xxxx-xxxx-xxxxxxxx
grant_type : password
scope : https://<tenant_name>.onmicrosoft.com/web_api/api.read offline_access
username : b2c_username
password : password

回復:

在此處輸入圖像描述

使用上面的刷新令牌,我能夠成功生成訪問令牌,如下所示:

POST https://<tenant_name>.b2clogin.com/<tenant_name>.onmicrosoft.com/<policy>/oauth2/v2.0/token
client_id : xxxxx-xxxx-xxxx-xxxxxxxx
grant_type:refresh_token
scope:https://<tenant_name>.onmicrosoft.com/web_api/api.read
redirect_uri:https://jwt.ms
refresh_token:paste_refresh_token

回復:

在此處輸入圖像描述

為了撤銷刷新令牌,我通過Graph Explorer運行以下查詢,如下所示:

POST https://graph.microsoft.com/beta/users/<user_id>/invalidateAllRefreshTokens

回復:在此處輸入圖像描述 C# 中的代碼示例:

GraphServiceClient graphClient = new GraphServiceClient( authProvider );
await graphClient.Users["userid"]
.InvalidateAllRefreshTokens()
.Request()
.PostAsync();

為了確認這一點,我在Portal中檢查了用戶的詳細信息,如下所示:

在此處輸入圖像描述

當我嘗試使用相同的刷新令牌獲取訪問令牌時,我收到錯誤消息說令牌已被撤銷,如下所示:

在此處輸入圖像描述

從 Graph API撤銷令牌后,最多可能需要5 分鍾才能工作。

如果您在as soon as you revoked刷新令牌后立即運行訪問令牌查詢,您可能仍會獲得訪問令牌。

因此,等待5-10分鍾,然后嘗試使用相同的查詢獲取訪問令牌。 然后,您將不會獲得訪問令牌,因為此時刷新令牌將被撤銷。

暫無
暫無

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

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