如何正确使用 WebAuthenticationCoreManager 获取 Microsoft 帐户令牌?

How to correctly use WebAuthenticationCoreManager to get a Microsoft Account token?

在过去的 5 年里,事情发生了很大的变化,我不确定如何让这个样本发挥作用:

https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/WebAccountManagement

这使用 "Account Manager" UI window 来显示大多数 Microsoft 帐户的列表,以从中获取访问令牌。我了解如何与 window 互动。我遇到的问题是 OAuth 端点、范围和应用程序 ID。

仅供参考,我使用的是 个人 Microsoft 帐户。

我认为这是使 UWP 应用程序能够使用此令牌服务的正确方法:

  1. 将您的 UWP 应用与商店相关联。 (这会为其提供一个自动进入清单的 SID。)
  2. https://apps.dev.microsoft.com 上注册一个应用 name/id。
  3. 将来自步骤 2 的应用程序 ID 从聚合应用程序部分复制到示例的 SingleMicrosoftAccountScenario 项目作为 AccountClientId
  4. 运行 应用程序并尝试登录。

这每次都会给我一个错误。这是让我困惑的地方:

  1. 示例中的默认范围是 OneDrive API 范围。我认为它已经消失了,取而代之的是 MS Graph。
  2. 我应该使用旧的 Live SDK 应用程序 ID 吗?
  3. 默认的本机应用回调 URI 可以吗?我需要使用不同的东西吗?通过深入阅读文档的某处,我尝试添加 ms-appx-web://Microsoft.AAD.BrokerPlugIn/{app sid},但这也没有用。
  4. 这么多帖子都在讲跨平台的ADAL或MSAL库。我也喜欢这个。我打算将它用于 Xamarin 的东西......但对于本机 UWP,我想将真正方便的 AccountsSettingsPane 与 WebAuthenticationCoreManager 一起使用。我已经使用 WebAuthenticationBroker 将 Facebook 添加到其中以获取令牌。

在我弄清楚这个 Microsoft 帐户问题之前,我一直被困住了。合并个人账户和企业账户真的很复杂...

这是我的发现:

  1. 对于使用 WebAuthenticationCoreManager 的 Microsoft 帐户,您只有两个权限可以让您“查找”PC 上的内置 Microsoft 帐户在 Windows 10 中注册。您可以使用“消费者”或“组织”。

  2. 如果您使用“组织”权限,WebAuthenticationCoreManager 将使用 v1 AAD 端点为您获取令牌...虽然这在理论上可以使用 MS图,我无法让它工作。 为了让它在示例中工作,您必须将添加的 属性 更改为 WebTokenRequest,如下所示。注意 URL 是不同的。我的范围是在应用程序注册网站上预设的。当您在 https://apps.dev.microsoft.com 注册您的应用程序并使用像 'user.read'.

    这样的纯图形 API 范围时,您使用聚合应用程序 ID
    webTokenRequest.Properties.Add("resource", "https://graph.microsoft.com");
  3. 如果您使用“消费者”权限,您根本不会获得与 MS Graph 兼容的令牌。相反,您会得到一个旧的 Live API 令牌。您可以通过使用此端点使用令牌 https://apis.live.net/v5.0/me 获取您的用户名来确认这一点。虽然我可以使用此令牌来验证我的用户,但此 API 已被弃用,并将在 2018 年 11 月(下个月!)离线。因此,您似乎不能将其用于个人帐户。如果你想让这个工作,你需要使用聚合 ID 号,而是使用旧的 Live API 范围“wl.basic”。

我的解决方法是根本不添加默认帐户,而是添加一个使用 MSAL 登录的自定义帐户。这很糟糕,因为这仍然需要初始登录。很遗憾,因为我们已经使用该帐户登录到 PC。看起来很愚蠢,我们需要再次输入凭据。

更新

此处的 github 存储库有一个有效的解决方案,可以使用 WebAuthenticationCoreManager 获取与 MS Graph API 一起使用的令牌。显示他们如何做的文件在这里:https://github.com/CommunityToolkit/Graph-Controls/blob/main/CommunityToolkit.Authentication.Uwp/WindowsProvider.cs