【问题标题】:What is correct platform for using the PublicClientApplication, Web or SPA?使用 PublicClientApplication、Web 或 SPA 的正确平台是什么?
【发布时间】:2021-06-01 21:48:58
【问题描述】:

我使用的是 silent-flow 示例,一切正常。但后来我看到我创建了 2 个(Web 和 SPA)平台。所以我决定做一个清理。因为我以为我只是使用Web 平台,所以我刚刚删除了SPA。但是问题来了,因为我现在在尝试登录时总是出错。

所以这是我只启用一个平台时的当前状态。

使用SPA时:

然后我得到

AADSTS9002325:需要用于代码交换的证明密钥 跨域授权码兑换。

当我使用Web:

我明白了:

"xxx: 请求正文 必须包含以下参数:“client_assertion”或 'client_secret'。\r\n跟踪 ID: xxx\r\n相关 ID: xxx\r\n时间戳:2021-03-03 09:59:07Z - 相关 ID:xxx - 跟踪 ID:xxx"

也许我不明白,但我只需要一个平台,对吗?

我还测试了两者都启用,但遇到了您在上面看到的相同问题。我的 Azure 门户可能有问题吗?因为除了删除和添加平台,我什么都没做。

并且确定设置Allow public client flows 设置为Yes

【问题讨论】:

  • 您是否在 Azure 门户中将 manifest 中的 allowPublicClient 设置为 true
  • Allow public client flowsallowPublicClient 一样。如果是这样,答案是Yes

标签: node.js azure-active-directory msal


【解决方案1】:

对于桌面应用程序,正确的平台既不是 Web 也不是 SPA,它是**移动和桌面应用程序”。

对于设备代码流,您确实需要设置重定向 URI,并将 允许客户端流 设置为

【讨论】:

  • Mine 是一个 Web 应用程序,在浏览器中运行。正如我已经说过的,Allow client flow 设置为 Yes
  • 对我来说不是一个好的解决方案,看看上面我是如何解决的:)
  • 对于在 .NET 5(或 core 3+)上运行的控制台应用程序,请参阅这篇文章:docs.microsoft.com/en-us/dotnet/api/… 基本上您在 PublicClientApplicationBuilder 上调用 .WithDefaultRedirectUri() 并将 Azure 上的 Redirect URIs 设置为 @ 987654323@.
【解决方案2】:

好的,我从PublicClientApplication 切换到ConfidentialClientApplication 并将clientSecret 添加到配置中:

const publicClientConfig = {
  auth: {
    clientId: "xxx",
    authority: "https://login.microsoftonline.com/common",
    redirectUri: "http://localhost:3000/redirect",
    clientSecret: "xxx"
  },
  cache: {
    cachePlugin
  },
};

然后在 Azure 中删除了SPA 平台,并添加了一个新的Web 平台:

现在可以再次正常工作了。

所以示例 silent-flow 已经过时了。已经提到了here

【讨论】:

    【解决方案3】:

    是的,你是对的,你不需要两个平台。要选择的 Active Directory 平台取决于您要使用的 OpenID Connect Flow。

    Web 平台用于在服务器上运行的 Web 应用程序。这样,服务器可以安全地存储长期存在的秘密/令牌。此方案的常见流程是Authorization Code。一旦用户登录到应用程序,服务器就会获得一个授权码并将其存储给这个特定的用户。现在,每次用户请求资源时,服务器都会将授权代码交换为短期令牌并将其用于请求。最后一个请求需要一个预定义的秘密,否则拦截授权码的每个人都可以发布令牌。

    如果您正在构建服务器端应用程序,您需要向服务器提供一个机密(通常称为客户端机密,因为服务器是身份验证服务器的客户端)。可以在“证书和机密”部分生成机密:

    您在上面提供的示例似乎是服务器端 Web 应用程序(通过节点/快速服务器提供车把模板)。

    SPA 平台用于在公共客户端(如网络浏览器)上运行的应用程序。由于我们没有可以维护这些机密的服务器,因此我们有两种选择:

    后一种是首选,其工作方式几乎与上述相同。除了您需要结合刷新令牌提供客户端生成的密钥 (PKCE) 以收集访问令牌之外。这一增加的安全层确保拥有刷新令牌的任何其他方都不能颁发访问令牌,除非他们也窃取了您的浏览器机密。

    如果您正在构建 SPA,我更喜欢您选择授权码 + PKCE。错误消息告诉我您将客户端身份验证设置为授权代码,而实际上您需要设置授权代码 + PKCE 流程。您的客户端应用程序必须提供代码质询(PKCE)。大多数 oidc 库都支持这一点。

    【讨论】:

    • 谢谢,但解决方案似乎要容易得多。无论如何感谢您的详细信息。
    猜你喜欢
    • 2016-08-21
    • 2019-03-07
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 2013-08-19
    • 1970-01-01
    • 2020-02-07
    相关资源
    最近更新 更多