2017-07-28 64 views
2

以下與Xamarin原生sample,樣品本身似乎工作正常ios,但是當我把我自己的憑據,輸入用戶名和密碼後,我彈出一個說:「Safari無法打開頁面,因爲地址是無效」。這是我的主要問題,如果有人可以建議,將非常感激。Xamarin.forms的Azure AD B2C「Safari因地址無效而無法打開頁面」?

雖然更大的問題是我不明白代碼中究竟發生了什麼。無論如何,我不在尋找重定向。我只是試圖讓一個令牌回到我的應用程序的代碼中,所以我想關閉Webform並將控制權返回給我的代碼。但是,我堅持彈出。 (這一切都可以在樣本中正常工作,但是當我放入自己的證書時,儘可能根據樣本中的筆記找出它們,我會得到此錯誤。)

我是認爲它必須對範圍或Tenant上的重定向設置做些什麼,但它在頁面和文檔中都非常不透明,這意味着什麼什麼是「範圍?」首先,爲什麼在範例參數中的值是一個url的樣本?

從我所知道的情況來看,我希望範圍是「OpenId」,因爲我使用的是本地認證,但如果將「範圍」設置爲{「OpenId」},則會出現錯誤,指出這些範圍是已包括在內。但是,如果您將其留空,您還會收到一條說明範圍是必需的錯誤。那該怎麼辦?

對於租戶設置頁面,如果我只是在我的應用上創建了一些服務登錄信息,爲什麼我需要回答「是」包含web應用/ web api?爲什麼回覆url設置爲不存在的值「https://myapi」?爲什麼App ID Uri設置爲「https://[applicationName]/onmicrosoft.com/demoapi?並且它的用途是什麼?

在」Native Client「部分,註冊提供了預填充字段」Redirect Uri「和」custom redirect uri「。重定向URI看起來像「甕: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租戶設置:

enter image description here

回答

0

我將我的答案分解成兩個因爲這裏有兩套不同的問題。

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

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

現在,應用程序需要接收該令牌。這是通過聽取uri方案完成的,uri方案是冒號前的所有內容。在這種情況下,URI方案是MSALxxxxxx。要配置您的xamarin應用程序來偵聽該URI方案,請按照步驟6 in this sample。這些步驟可幫助您爲每種平臺配置返回URI。現在,只要瀏覽器檢測到重定向到MSALxxxx,它就會將消息發送到您的應用程序。在這種情況下,您將在消息中收到一個B2C令牌。順便說一下,「urn:ietf:wg:oauth:2.0:oob」只是我們提供的默認重定向URI。我們建議您僅將其用於測試目的,並且爲您的應用程序創建唯一的重定向URI方案。

0

看到我的上面或下面的其他答案,回答有關重定向URI的問題。

的範圍:

作用域大多是必要的,當你調用API。認爲他們像權限。例如,你可以有一個「任務列表」API來存儲當天的任務。假設您希望您的應用能夠從API中「讀取」。因此,您可以調用Azure AD B2C,並請求一個訪問令牌,使您能夠從API中「讀取」。您可以通過在請求中插入「讀取」作爲其中一個範圍來執行此操作。

問題是,任何API都可以具有讀取範圍,因此爲了區分您所指的是哪個API,您可以使用App ID URI。因此,在Azure AD B2C中,您將App ID URI設置爲「https://tenantName.onmicrosoft.com/tasksList」。然後,當您提出請求時,將範圍指定爲「https://tenantName.onmicrosoft.com/tasksList/read」(請注意,「讀取」已添加到該「URL」末尾))

相關問題