【问题标题】:Azure AD B2C Redirects with a "#" before the id_tokenAzure AD B2C 重定向在 id_token 前带有“#”
【发布时间】:2016-03-03 08:31:56
【问题描述】:

我根据一些文档创建了一个 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/”

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

“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 应用程序。

谢谢。

【问题讨论】:

    标签: python django azure-ad-b2c


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我也不能评论,

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

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

      根据AngularJS: Developer Guide

      在 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 永远不会执行完整的页面重新加载。

      【讨论】:

      • 您能解释一下为什么启用 HTML5 模式将有助于解决 OP 的问题吗?这可能会产生更好的答案/解决方案。
      【解决方案3】:

      我(还)不允许发表评论,所以我必须将我的评论放在答案中。 几分钟前,我在 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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-18
        • 1970-01-01
        • 2018-05-15
        • 2018-04-29
        • 2021-04-04
        • 2020-08-12
        • 2018-08-25
        相关资源
        最近更新 更多