2

我根据一些文档创建了一个 B2C 设置。我参考了以下链接。

https://blogs.technet.microsoft.com/ad/2015/09/16/azure-ad-b2c-and-b2b-are-now-in-public-preview/

所以我设置了一个redirect_uri,比如说,

“http s://mycompany.com/login/”

并使用谷歌作为我的身份提供者。但是,当我进行注册/登录时,系统会将我从注册/登录页面重定向到

“http s://mycompany.com/login/#id_token=eyJ0eXAi...”

B2C 返回的重定向 URL 包含一个“id_token”变量,在“ http://calebb.net/ ”中检查后,它包含的详细信息与预期一致。

我遇到的问题是在 redirect_uri 之后和 id_token 变量之前的哈希“#”标记。由于散列,id_token 变量不会发送到我们的服务器,因为浏览器的默认行为是在散列标记之后不发送任何内容。哈希标记是片段标识符。

因此我无法获得 id_token 的值。

有没有办法克服这个限制,让我们的服务端应用可以从 B2C 系统返回的 URL 中获取 id_token 的值呢?还是这就像 B2C 中需要修复的错误?

我正在使用 Python/Django Web 应用程序。

谢谢。

4

3 回答 3

3

在策略链接 URL 中将“response_mode”参数值作为“query”或“form_post”传递以克服 # 问题。

有关更多信息,请查看:https ://docs.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-reference-oauth-code

于 2019-03-06T06:40:42.713 回答
2

我也不允许发表评论,

如果您将 AngularJS 用于前端,则启用HTML5模式。

我用过这个$locationProvider.html5Mode(true);

根据AngularJS:开发者指南

在 HTML5 模式下,$location 服务的 getter 和 setter 通过 HTML5 历史 API 与浏览器 URL 地址进行交互。这允许使用常规的 URL 路径和搜索段,而不是它们的 hashbang 等价物。如果浏览器不支持 HTML5 History API,$location 服务将自动回退到使用 hashbang URL。这让您不必担心显示您的应用程序的浏览器是否支持历史 API;$location 服务透明地使用最佳可用选项。

在旧版浏览器中打开常规 URL -> 重定向到 hashbang URL 在现代浏览器中打开 hashbang URL -> 重写为常规 URL 请注意,在这种模式下,Angular 会拦截所有链接(受以下“Html 链接重写”规则的约束) ) 并以从不执行完整页面重新加载的方式更新 url。

于 2016-03-26T17:31:17.643 回答
0

我(还)不允许发表评论,所以我必须把我的评论放在答案中。几分钟前,我在 NodeJS B2C 示例中遇到了同样的问题。我在您的http s://mycompany.com/login/端点上放置了一条 POST 路由

app.post('/',
passport.authenticate('azuread-openidconnect', { failureRedirect: '/login' }),
    function(req, res) {
      log.info('We received a POST from AzureAD.');
      log.info(req.body.id_token);
      res.redirect('/');
     });

然后将其导入护照 JavaScript 库进行身份验证。

可能这会给您一个指示,您可以将其传输到 Python/Django。

于 2016-03-24T19:15:13.517 回答