适用于Xamarin.forms的Azure AD B2C“Safari无法打开该页面,因为地址无效”?

时间:2017-07-28 20:49:54

标签: azure xamarin.forms azure-active-directory azure-ad-b2c

继Xamarin本地sample之后,示例本身似乎在ios上工作正常,但是当我输入自己的凭据时,在输入用户名和密码后,我弹出一个“Safari无法打开页面因为地址无效“。这是我的主要问题,如果有人可以建议那将是非常感激的。

更大的问题是我不明白代码中实际发生了什么。无论如何,我不是在认证后寻找重定向。我只是想让一个令牌回到我的应用程序的代码,所以我想解除webform并将控制权返回给我的代码。但相反,我坚持弹出窗口。 (这一切都正常,并且正如预期的那样,但是当我输入自己的凭据时,尽管我可以根据示例中的注释找出它们,但我得到了这个错误。)

我认为必须对租户的范围或重定向设置做一些事情,但它在页面和文档中都非常不透明,这意味着什么。什么是“范围”?首先,为什么值作为范例参数在样本中是一个url?

据我所知,我希望范围是“OpenId”,因为我使用的是本地身份验证,但是如果你将“范围”设置为{“OpenId”},则会出现错误,说明这些范围已经是包括在内。但是如果你把它留空,你也会收到一个错误,说明需要范围。那又怎么样呢?

关于租户设置页面,如果我只在我的应用程序上构建一些服务登录,为什么我需要对“包含web app / web api?”这个问题回答“是”。为什么回复网址设置为不存在的值“https://myapi”?为什么App ID Uri设置为“https://[applicationName]/onmicrosoft.com/demoapi?”它的目的是什么?

在“Native Client”部分中,注册提供预先填充的字段“Redirect Uri”和“custom redirect uri”。重定向URI看起来像“urn:ietf:wg:oauth:2.0:oob”。那是什么?弹出窗口说它是

  

“B2C将用户代理重定向到的唯一标识符   誓言2.0回应“

但它看起来不像这里有足够的字母可能是唯一的ID。

有一个名为“the”自定义“重定向uri的东西,我猜这与普通的”Redirect 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

2 个答案:

答案 0 :(得分:0)

我将我的答案分成两个帖子,因为这里有两组不同的问题。

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

离开浏览器并返回您的应用程序主要是使用重定向uri完成的。 MSALxxxxxx:// oauth是您(根据截图)在B2C注册的重定向uri路径。看起来很好。当您调用Azure AD B2C时,需要确保将重定向URI设置为该值。当Azure AD B2C生成令牌时,它会将其发送到该重定向URI。

现在,应用需要接收该令牌。这是通过听取uri方案来完成的,这是冒号之前的一切。在这种情况下,URI方案是MSALxxxxxx。要配置您的xamarin应用程序以侦听该URI方案,请执行步骤6 in this sample。这些步骤可帮助您为每种平台配置返回URI。现在,只要浏览器检测到重定向到MSALxxxx,它就会将消息发送到您的应用程序。在这种情况下,您将在邮件中收到B2C令牌。

顺便说一下," urn:ietf:wg:oauth:2.0:oob"只是我们提供的默认重定向URI。我们建议您仅将其用于测试目的,并为您的应用创建唯一的重定向URI方案。

答案 1 :(得分:0)

请参阅我上面或下面的其他答案,以回答有关重定向URI的问题。

的范围:

当您调用API时,范围通常是必需的。把它们想象成权限。例如,您可以拥有一个"任务列表"存储当天任务的api。假设您希望自己的应用能够“阅读”#34;来自API。因此,您可以调用Azure AD B2C,并请求一个访问令牌,使您能够阅读"来自API。你可以通过插入" read"作为您请求中的一个范围。

问题是,任何API都可以具有读取范围,因此要区分您引用的API,请使用App ID URI。因此,在Azure AD B2C中,您将App ID URI设置为" https://tenantName.onmicrosoft.com/tasksList"。然后,当您提出请求时,请将范围指定为" https://tenantName.onmicrosoft.com/tasksList/read" (注意'阅读'被添加到#34; URL"

的末尾。