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

Posted

技术标签:

【中文标题】如何从已登录用户处获取“B2C JWT 访问令牌”?【英文标题】:How to obtain "B2C JWT Access Token" from the signed in User? 【发布时间】:2019-11-03 16:13:42 【问题描述】:

我正在使用 .Net Core Web API 和 .Net Core Web MVC 应用程序。他们都使用 Azure AD B2C 对用户进行身份验证。但是为了从 Web API 的 HttpRequest 中获得响应,我需要为我的 Web MVC 应用程序上的登录用户提供来自 B2C 的 JWT 访问令牌。有没有办法使用经过身份验证的“用户”在控制器内获取此访问令牌。

我已尝试访问已登录用户的声明,但没有运气,我还使用 jwt.ms 来检查 B2C 工作流程是否运行良好,并且正在生成 JWT 令牌并且它运行良好。 MVC 应用程序正在对用户进行身份验证,并且 Web API 使用硬编码令牌正常工作。我只需要从登录用户那里获取访​​问令牌,而不是硬编码。

我希望能够获得 B2C JWT 访问令牌,以便稍后将其传递给 Web Api 并能够保护我的请求。

【问题讨论】:

另一个可能有帮助的信息是我正在使用 .Net Core Web MVC 应用程序的 B2C 模板,该应用程序使用 AzureADB2C.UI Nuget 包从 Azure 获取 JWT。 【参考方案1】:

您可以参考this sample application。

它使用the ASP.NET Core Azure AD B2C middleware 对最终用户进行身份验证,并使用MSAL.NET 获取、缓存和刷新访问令牌。

访问令牌在the AzureADB2COpenIdConnectOptionsConfigurator class中获取。

引用访问令牌的控制器方法的代码示例是here。

【讨论】:

感谢您的回答 Chris,但 B2C 已经为我(我的网站带有上面的 nuget 包)提供了初始 JWT。有没有办法在任何地方访问这个初始令牌?我必须手动获取额外的令牌吗? 嗨@AndreVigneault 我已经参考 AzureADB2C.UI 包更新了上述答案。【参考方案2】:

在获得 MS AzureADB2C.UI GitHub 团队的帮助后,我们得以解决该问题。问题是默认情况下令牌不会保存在库中,因此我们需要配置 OIDC 以指定必须保存令牌以供将来在应用程序中使用。所以这里是“启动”配置的示例代码以及如何从控制器查询“JWT 访问令牌”的示例。

Startup.cs:

    services.Configure(AzureADB2CDefaults.OpenIdScheme, options => 
            options.SaveTokens = true;
    );

控制器:

    string idToken = await HttpContext.GetTokenAsync("id_token");

有关问题如何解决的更多信息,请访问以下链接: https://github.com/aspnet/AspNetCore/issues/11424

【讨论】:

嗨@Andre 这是否也保存了访问令牌? 是的,@ChrisPadgett 确实如此。 谢谢你,Andre,我相信 AzureADB2C.UI 包在过期后不会刷新访问令牌。我创建了一个使用 MSAL.NET 执行此操作的示例应用程序。我已经更新了我的其他答案,并引用了 here 中的示例应用程序。【参考方案3】:

它是您需要的实际令牌字符串吗?如果是这样,您可以使用控制器中的 HttpContext 访问标头吗? HttpContext 将包含一组传入的标头

【讨论】:

它实际上是我需要的来自 B2C 字符串的原始 JSON Web Token,但我需要从 Web App 的 MVC 控制器访问它。我尝试了您的建议,但在查看 HttpContext 标头后,我仍然看不到令牌字符串。您是否有任何我可以查看的代码示例或 sn-p? @AndreVigneault 据我所知,它应该作为带有键Authorization 和值Bearer <token here> 的标题。您根本看不到 Auth 标头吗? 我所说的“应该”是正确的。您是否已将 IHttpContextAccessor 添加到 ServicesCollection 注册并将其注入您的控制器以访问标头?我会为你挖掘一些示例代码 感谢罗伯特的跟进,是的,我正在使用 IHttpContextAccessor,但仍然找不到 JWT 令牌,如果您有的话,代码示例肯定会很有用。

以上是关于如何从已登录用户处获取“B2C JWT 访问令牌”?的主要内容,如果未能解决你的问题,请参考以下文章

如何检测用户是不是从已识别的计算机连接?

从登录用户 Flutter/Firebase 获取文档列表

如何从已删除的消息中获取嵌入内容?

如何从已编译的 Electron 应用程序中获取源文件?

如何获取 PHP 脚本以从已运行的进程发送和接收数据?

从已检索的资产中删除CIFilter