簡體   English   中英

Xamarin.forms 的 Azure AD B2C“Safari 無法打開頁面,因為地址無效”?

[英]Azure AD B2C for Xamarin.forms "Safari cannot open the page because the address is invalid"?

跟隨 Xamarin 本機示例,示例本身似乎在 ios 上運行良好,但是當我輸入自己的憑據時,在輸入用戶名和密碼后,我會彈出一個顯示“Safari 無法打開頁面,因為地址無效”的彈出窗口. 這是我的主要問題,如果有人可以提出建議,將不勝感激。

更大的問題是我不明白代碼中實際發生了什么。 無論如何,我不是在尋找身份驗證后的重定向。 我只是想將令牌返回給我的應用程序代碼,因此我想關閉網絡表單並將控制權返回給我的代碼。 但相反,我被彈出窗口困住了。 (這一切都很好,並且與示例中的預期一致,但是當我輸入自己的憑據時,我會根據示例中的注釋盡我所能弄清楚它們,我收到此錯誤。)

我認為它必須對租戶上的范圍或重定向設置做一些事情,但它在頁面上和文檔中都非常不透明,這意味着什么,例如什么是“范圍”? 首先,為什么該值作為 url 示例中的范圍參數?

據我所知,我想要的范圍是“OpenId”,因為我使用的是本地身份驗證,但是如果您將“范圍”設置為 {“OpenId”},您會收到一條錯誤消息,指出這些范圍已經包含在內。 但是如果您將其留空,您還會收到一條錯誤消息,指出需要作用域。 那怎么辦?

關於租戶設置頁面,如果我只是在我的應用程序上構建一些服務登錄的東西,為什么我需要對問題“包括 web 應用程序/web api?”回答“是”。 為什么回復 url 設置為不存在的值“ https://myapi ”? 為什么 App ID Uri 設置為“ https://[applicationName]/onmicrosoft.com/demoapi ?它的目的是什么?

在“本機客戶端”部分,注冊提供了預先填充的字段“重定向 Uri”和“自定義重定向 uri”。 重定向 URI 看起來像“urn:ietf:wg:oauth:2.0:oob”。 那是什么? 彈出窗口說這是一個

“B2C 將在 Oath2.0 響應中重定向用戶代理的唯一標識符”

但看起來這里沒有足夠的字母可能是唯一的 ID。

有一種叫做“自定義”重定向 uri 的東西,我猜它與普通的舊“重定向 URI”不同,它看起來像

msal3b4c7038-694a-42d6-bab0-43d5b1f86106://auth

那么為什么一個是“習慣”,而另一個顯然不是習慣呢?

很抱歉所有問題,但我找不到解釋這些問題的好文檔。 非常感謝,如果 Azure 中的任何人在聽,也許他們可以指出一些有助於我理解這一點的 Xamarin/Azure 文檔。

非常感謝!

PS 也許這篇文章的問題太多了,我不確定我是否應該將它們分成單獨的問題。 如果是這樣,請告訴我。 我的主要問題是第一個問題。

相關代碼如下:

    public static string Tenant = "crowdwisdom.onmicrosoft.com";
        public static string ClientID = "3b4c7038-694a-44c6-bab0-43d5b1f86106";
        public static string PolicySignUpSignIn = "B2C_1_susi";
        public static string PolicyEditProfile = "B2C_1_edit_profile";
        public static string PolicyResetPassword = "B2C_1_reset";

        public static string[] Scopes = { "https://crowdwisdom.onmicrosoft.com/demoapi/demo.read" };
        public static string ApiEndpoint = "https://crowdwisdom.azurewebsites.net";

        public static string AuthorityBase = $"https://login.microsoftonline.com/tfp/{Tenant}/";
        public static string Authority = $"{AuthorityBase}{PolicySignUpSignIn}";
        public static string AuthorityEditProfile = $"{AuthorityBase}{PolicyEditProfile}";
        public static string AuthorityPasswordReset = $"{AuthorityBase}{PolicyResetPassword}";

        public static UIParent UiParent = null;

...

async void OnSignInSignOut(object sender, EventArgs e)
    {
        try
        {
            if (btnSignInSignOut.Text == "Sign in")
            {
                AuthenticationResult ar = await App.PCA.AcquireTokenAsync(App.Scopes, GetUserByPolicy(App.PCA.Users, App.PolicySignUpSignIn), App.UiParent);
                UpdateUserInfo(ar);
                UpdateSignInState(true);
            }
            else
            {
                foreach (var user in App.PCA.Users)
                {
                    App.PCA.Remove(user);
                }
                UpdateSignInState(false);
            }
        }
        catch(Exception ex)
        {
            // Checking the exception message 
            // should ONLY be done for B2C
            // reset and not any other error.
            if (ex.Message.Contains("AADB2C90118"))
                OnPasswordReset();
            // Alert if any exception excludig user cancelling sign-in dialog
            else if (((ex as MsalException)?.ErrorCode != "authentication_canceled"))
                await DisplayAlert($"Exception:", ex.ToString(), "Dismiss");
        }
    }

這是 Azure B2C 租戶設置:

在此處輸入圖片說明

由於這里有兩組不同的問題,因此我將答案分為兩篇。

重定向URI(如何返回到您的應用)

離開瀏覽器並返回到您的應用程序大部分是使用重定向uri完成的。 MSALxxxxxx:// oauth是您(根據您的屏幕截圖)已向B2C注冊的重定向uri路徑。 這看起來不錯。 調用Azure AD B2C時,需要確保將重定向URI設置為該值。 當Azure AD B2C生成令牌時,它將把令牌轉發給該重定向URI。

現在,應用程序需要接收該令牌。 這是通過聽一個uri方案來完成的,這是冒號之前的一切。 在這種情況下,URI方案為MSALxxxxxx。 要將xamarin應用程序配置為偵聽該URI方案,請遵循此示例中的步驟6。 該步驟可幫助您為每種平台配置返回URI。 現在,每當瀏覽器檢測到重定向到MSALxxxx時,它將把消息轉發到您的應用程序。 在這種情況下,您會在郵件中收到B2C令牌。

順便說一句,“ urn:ietf:wg:oauth:2.0:oob”只是我們提供的默認重定向URI。 我們建議您僅將其用於測試目的,並為應用程序創建唯一的重定向URI方案。

請參閱上方或下方的其他答案,該答案回答有關重定向URI的問題。

作用域:

在調用API時,范圍是最必要的。 將它們視為權限。 例如,您可能有一個“任務列表” api,用於存儲當天的任務。 假設您希望您的應用程序能夠從API“讀取”。 因此,您調用Azure AD B2C,並請求一個訪問令牌,該令牌使您能夠從API“讀取”。 為此,您可以在請求中插入“ read”作為作用域之一。

問題是,任何API都可以具有讀取范圍,因此,使用App ID URI來區分您所指的是哪個API。 因此,在Azure AD B2C中,將應用程序ID URI設置為“ https://tenantName.onmicrosoft.com/tasksList ”。 然后,在發出請求時,將范圍指定為“ https://tenantName.onmicrosoft.com/tasksList/read ”(注意,“ read”已添加到該“ URL”的末尾)

由於這兩個答案都沒有幫助我解決這個問題,我將把我的答案放在這里,因為自這篇文章以來庫已經更新。

向 Azure AD B2C 應用程序添加重定向 URI 的新方法如下所示:

在此處輸入圖片說明

但我找不到有關如何正確配置應用程序以使其工作的說明。 所以我不得不像這樣以舊方式配置重定向:

在此處輸入圖片說明

這阻止了 Safari 中的錯誤,我通過向 Microsoft.Identity 庫添加日志記錄、復制它試圖從日志加載的 URL 並將其粘貼到 Safari 中解決了該錯誤。 這表明來自 Azure 的錯誤是缺少重定向。

在此處輸入圖片說明

我希望這對其他人有所幫助,如果您知道為什么新方法不起作用,也請在此處發布。

暫無
暫無

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

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