如何使用 B2C 和 Blazor 获取 JWT 不记名令牌

Posted

技术标签:

【中文标题】如何使用 B2C 和 Blazor 获取 JWT 不记名令牌【英文标题】:How Do I Get the JWT Bearer Token Using B2C and Blazor 【发布时间】:2020-03-18 18:22:43 【问题描述】:

我使用 Visual Studio 模板创建了一个新的 Blazor 应用,在项目创建期间使用向导添加了 B2C。

所有功能都非常适合身份验证。我可以使用我最喜欢的身份提供者登录并接收 id_token。我不知道在哪里可以获得 id_token,但我可以在我的用户身份中看到声明。

我需要帮助的是如何获取声明中的信息来获取访问令牌。我需要这个令牌来调用我的端点。

这似乎应该是直截了当和常见的事情,但我似乎找不到任何好的例子。

在普通的 MVC 应用程序中,我可以通过 ConfidentialClientApplicationBuilder.AcquireTokenByAuthorizationCode 获取此信息,但这在 Blazor 中不起作用(除非我做错了什么)。

我试过这个:https://docs.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-access-tokens

我认为它会起作用。如何在我的 blazor 应用程序中获取“代码”(id_token)?这是在幕后解码的内容,我能找到的只是解码“代码”所产生的声明。

我已使用 azure 的“运行用户流程”访问示例 id_token("code") 并将其粘贴到我的项目中并在上面的链接中进行调用,它似乎可以工作。我遇到了权限问题,但这至少是一个成功的调用。

也许如果我可以访问 id_token 我可以让它从那里工作?

【问题讨论】:

我已经为此奋斗了好几个星期。当我读到你的“这似乎应该是简单而普通的事情......”时,我几乎要团结一致地哭了。是的,你认为它应该是。这是我 8 年开发过程中最令人沮丧的编码经历。 【参考方案1】:

这似乎是一个客户端应用程序,类似于 SPA。在这种情况下,您必须使用隐式流,其中响应类型为“id_token 令牌”,并在一次调用中向浏览器返回一个 id 令牌和访问令牌。这不是一个确切的答案,但只有我们的 MSAL.js 库可以进行这种类型的调用,但 Blazor 似乎使用 C#,而 msal .net 不进行客户端身份验证调用。只要您将应用程序注册为本机应用程序,acquireTokenByAuthCode() 就可以在客户端工作,因此不需要密码。

【讨论】:

Jas,你有什么代码可以解释这个吗?我遇到了同样的问题,需要一些我可以解决的问题。 SPA 应用使用隐式流,.Net 使用验证码流:docs.microsoft.com/en-us/azure/active-directory-b2c/… 感谢 Jas 的指点。我希望有一个非 js 的例子。 Blazor 和所有的一切令人兴奋。也许没有,但我只需要认为有一个 .net 框架答案。这似乎是一种常见的情况。我不敢相信我在找到它时遇到了这样的问题。而且,你是对的。 Blazor 是一个客户端应用程序。它完全在客户端上运行。无需托管服务器。只是一个存储文件的地方。 Blazor 的另一大优势。 这个样本在任何地方都可以公开吗?草稿形式的活动? 还没有,不太确定状态。

以上是关于如何使用 B2C 和 Blazor 获取 JWT 不记名令牌的主要内容,如果未能解决你的问题,请参考以下文章

如何从已登录用户处获取“B2C JWT 访问令牌”?

如何使用 Azure AD B2C 保护 Blazor Wasm 应用访问的 Azure 函数?

使用 azure AD B2C 进行 blazor web api 身份验证

如何在没有 Microsoft 身份的情况下对 blazor 服务器进行 jwt 身份验证?

如何在 Web API 中验证 Azure B2C JWT 令牌?

解析 JWT 令牌以仅在 C# 或 Blazor 中没有外部库的情况下获取有效负载内容