![](/img/trans.png)
[英]Error “Safari cannot open the page because the address is invalid” with Azure AD B2C
[英]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”的末尾)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.