继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租户设置:
答案 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"
的末尾。