连接到 Azure B2C 时如何调试 oauth2_proxy?

2024-02-06

我是 Kubernetes 的新手,一直在学习 Ingress。在 Ingress 处理 TLS 证书和身份验证的想法给我留下了深刻的印象。我添加了一个简单的静态文件服务器,并添加了cert-manager,所以我基本上有了一个HTTPS静态网站。

我读到 NGINX 入口控制器可以与 oauth2 代理一起使用来处理入口处的身份验证。问题是我根本无法让这个工作。我可以确认我的 oauth2-proxy 部署服务和部署存在且正确 - 在 Pod 日志中,我可以看到来自 NGINX 的请求,但我看不到它在 Azure B2C 上实际调用的 uri。每当我尝试访问我的服务时,我都会收到 500 内部错误 - 如果我将 /oath2/auth 地址放入浏览器中,我会收到“不支持请求中指定的范围‘openid’。”。但是,如果我在 Azure 中测试运行用户流,测试 URL 也会指定“openid”,并且它会按预期运行。

我认为,如果我能找出如何监视来自 Azure 的 oauth2-proxy 请求(即通过观察它的 uri 找出我的配置错误的位置),我就可以解决这个问题 - 否则,也许做过此操作的人可以告诉我哪里我在配置中出错了。

我的配置如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    k8s-app: oauth2-proxy
  name: oauth2-proxy
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: oauth2-proxy
  template:
    metadata:
      labels:
        k8s-app: oauth2-proxy
    spec:
      containers:
      - args:
        - -provider=oidc
        - -email-domain=*
        - -upstream=file:///dev/null
        - -http-address=0.0.0.0:4180
        - -redirect-url=https://jwt.ms/
        - -oidc-issuer-url=https://<tenant>.b2clogin.com/tfp/<app-guid>/b2c_1_manager_signup/
        - -cookie-secure=true
        - -scope="openid"

        # Register a new application
        # https://github.com/settings/applications/new
        env:
        - name: OAUTH2_PROXY_CLIENT_ID
          value: <app-guid>
        - name: OAUTH2_PROXY_CLIENT_SECRET
          value: <key-base64>
        - name: OAUTH2_PROXY_COOKIE_SECRET
          value: <random+base64>
        image: quay.io/pusher/oauth2_proxy:latest
        imagePullPolicy: Always
        name: oauth2-proxy
        ports:
        - containerPort: 4180
          protocol: TCP
---

apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: oauth2-proxy
  name: oauth2-proxy
  namespace: default
spec:
  ports:
  - name: http
    port: 4180
    protocol: TCP
    targetPort: 4180
  selector:
    k8s-app: oauth2-proxy
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: static1-oauth2-proxy
  namespace: default
  annotations:
    kubernetes.io/ingress.class: nginx
    kubernetes.io/tls-acme: "true"
spec:
  rules:
  - host: cloud.<mydomain>
    http:
      paths:
      - backend:
          serviceName: oauth2-proxy
          servicePort: 4180
        path: /oauth2
  tls:
  - hosts:
    - cloud.<mydomain>
    secretName: cloud-demo-crt

在我的静态站点入口中,我将以下内容添加到metadata.annotations中:

    nginx.ingress.kubernetes.io/auth-url: "https://$host/oauth2/auth"
    nginx.ingress.kubernetes.io/auth-signin: "https://$host/oauth2/start?rd=$request_uri"

我不是 100% 确定这些注释是否应该始终如此设置,或者我是否应该为 B2C/OIDC 更改这些注释,但它们似乎会转到代理,只是代理接下来执行的操作失败了。

请注意,日志确实表明 oauth2-proxy 连接到了 B2C,实际上,如果颁发者 uri 发生更改,则会进入崩溃回退循环。

似乎有很多关于如何设置它的文章,所以我确信这是可能的,但我有点迷失了。如果有人可以帮助进行设置或调试想法,那就太好了。

Thanks.


现在我可以可靠地获取 ?state= 和 code= 显示在 /oauth2/callback 页面上的浏览器窗口中,但该页面报告内部错误。 oauth2_proxy 正在记录,日志显示:

[2020/06/03 21:18:07] [oauthproxy.go:803] OAuth2回调期间兑换代码时出错:令牌交换:oauth2:服务器响应缺少access_token

然而,我的 Azure B2C 审核日志显示它正在颁发 id_tokens。

当我查看 oauth2_proxy 的源代码时,看起来好像问题发生在 oauth2.config.Exchange() 期间 - 它位于 goloang 库中 - 我不知道它的作用,但我不认为它是与 Azure B2c 一起正常工作。有人知道我如何从这里进步吗?

Thanks.

Mark


我求助于在 VSCode 中编译和调试代理应用程序。我运行了一个简单的 NGINX 代理来向代理提供 TLS 终止,以允许 Azure B2C 端运行。事实证明我做错了很多事情。以下是我解决的问题列表,希望其他人能够使用它来通过 Azure B2C 运行自己的 oauth_proxy。

当附加到调试器时,很明显,oauth2_proxy 读取令牌并期望依次fin,access_token,然后id_token,然后它需要(默认情况下)“电子邮件”声明。

要返回“access_token”,您必须请求访问某些资源。最初我没有这个。在我的 yaml 文件中,我有:

    - --scope=openid

注意:不要在 YAML 中的范围值两边加上引号,因为它们会被视为请求范围值的一部分!

我必须通过“应用程序注册”和“公开 API”在 Azure B2C 中设置“读取”范围。我最终有效的范围是这样的:

    - --scope=https://<myspacename>.onmicrosoft.com/<myapiname>/read openid

您必须确保两个范围(read 和 openid)一起通过,否则您不会获得 id_token。如果您收到一条错误消息,指出服务器响应中没有 id_token,请确保在使用 --scope 标志的单次使用中同时处理这两个值。

一旦您拥有 access_token 和 id_token,oauth2_proxy 就会失败,因为没有“电子邮件”声明。 Azure B2C 有一个“电子邮件”声明,但我认为不能使用。为了解决这个问题,我使用了对象 id,我设置:

    - --user-id-claim=oid

我遇到的最后一个问题是浏览器中没有设置 cookie。我确实在 oauth2-proxy 输出中看到了一个错误,即 cookie 值本身太长,然后我删除了“offline_access”范围,该消息就消失了。然而浏览器中仍然没有cookie。

然而,我的 NGinX 入口日志确实有一条消息,表明标头超过 8K,因此 NGinX 报告 503 错误。

在 oauth2-proxy 文档中,有一个描述,如果您的 cookie 很长,则应使用 Redis 存储 - 它特别将 Azure AD cookie 标识为足够长以保证 Redis 解决方案。

我安装了一个单节点 Redis 来使用此答案中的 YAML 配置进行测试(未强化)https://stackoverflow.com/a/53052122/2048821 https://stackoverflow.com/a/53052122/2048821- 必须使用 --session-store-type=redis 和 --redis-connection-url 选项。

我的 oauth2_proxy 的最终服务/部署如下所示:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    k8s-app: oauth2-proxy
  name: oauth2-proxy
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: oauth2-proxy
  template:
    metadata:
      labels:
        k8s-app: oauth2-proxy
    spec:
      containers:
      - args:
        - --provider=oidc
        - --email-domain=*
        - --upstream=file:///dev/null
        - --http-address=0.0.0.0:4180
        - --redirect-url=https://<myhost>/oauth2/callback
        - --oidc-issuer-url=https://<mynamespane>.b2clogin.com/tfp/<my-tenant>/b2c_1_signin/v2.0/
        - --cookie-secure=true
        - --cookie-domain=<myhost>
        - --cookie-secret=<mycookiesecret>
        - --user-id-claim=oid
        - --scope=https://<mynamespace>.onmicrosoft.com/<myappname>/read openid
        - --reverse-proxy=true
        - --skip-provider-button=true
        - --client-id=<myappid>
        - --client-secret=<myclientsecret>
        - --session-store-type=redis
        - --redis-connection-url=redis://redis:6379

        # Register a new application
        image: quay.io/pusher/oauth2_proxy:latest
        imagePullPolicy: Always
        name: oauth2-proxy
        ports:
        - containerPort: 4180
          protocol: TCP

---

apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: oauth2-proxy
  name: oauth2-proxy
  namespace: default
spec:
  ports:
  - name: http
    port: 4180
    protocol: TCP
    targetPort: 4180
  selector:
    k8s-app: oauth2-proxy

希望这可以为某人节省很多时间。

Mark

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

连接到 Azure B2C 时如何调试 oauth2_proxy? 的相关文章

  • 为什么 Azure IoT 中心中有主键和辅助键?

    在 Azure IoT 中心创建共享访问策略或注册设备时 将生成主密钥和辅助密钥对 我注意到我可以使用主键或辅助键将设备连接到 IoT 中心 那么 拥有主键 辅助键的目的是什么 我应该如何设计这两个键的使用 主键和辅助键的目标有两个 首先
  • 使用 Powershell 或 C# 获取 Azure“文件和文件夹”作业状态

    我一直在尝试找到一种方法来获取在 AzureRM 中运行的几个客户上运行的 文件和文件夹 备份作业的状态 可以在 AzureRm 门户中手动找到状态 恢复服务保管库 gt 作业 gt 备份作业 使用powershell不显示任何作业信息 G
  • Azure 表存储分区键

    两个有些相关的问题 1 是否有办法获取表实体所在服务器的ID 2 使用 GUID 能否为我提供最佳的分区键分布 如果没有 那又会怎样呢 几周来我们一直在为表存储性能而苦苦挣扎 简而言之 这确实很糟糕 但我们很早就意识到使用随机分区键会将实体
  • uwsgi协议比http协议快吗?

    我正在尝试部署 django 应用程序的各种设置 我的第一选择是使用带有 mod wsgi 的简单 apache 服务器 我之前已经实现了该服务器供私人使用 由于当前的部署是供公众使用的 因此我正在考虑各种选择 根据网上提供的信息 使用 n
  • 禁用 Kubernetes NGINX 入口的 SSL 重定向

    默认情况下 在 Kubernetes NGINX 入口中启用 SSL 重定向 如何禁用此功能 目前的实施如下 apiVersion extensions v1beta1 kind Ingress metadata name project
  • 在 azure Web 应用程序容器上部署 .net Core 3 Linux 容器,出现 IdentityServer4 认证/http 错误

    我正在尝试使用 Net Core 干净架构应用程序模板 https github com jasontaylordev CleanArchitecture并使其在容器中运行并通过 Azure CI CD 管道进行部署 我在 Linux 容器
  • Web.config 在 Azure 部署期间发生(大幅)更改

    部署到 Azure 后 我不断收到服务器错误 应用程序无法运行 所以我在实例中做了一个远程桌面 发现 web config 被彻底修改了 这是怎么回事 我以为 web config 是按原样打包的 相反 整个配置已被替换 当我用原始的 未改
  • Windows Azure 上的 .NET 4.0?

    我的谷歌搜索在这方面让我失败了 作为一个可能的解决方案在 VS2010 中使用 MStest 对 NET 3 5 项目进行单元测试 https stackoverflow com questions 1679404 unit testing
  • Azure AD 应用程序未出现在 Azure Web 应用程序的现有 AD 应用程序列表中

    我刚刚进行了一些演练 其中创建了一个 Azure AD 应用程序 将其用作我的 Azure Web 应用程序中的授权 身份验证 现在 当我为我的 Azure 网站 应用服务 选择现有 AD 应用程序时 它不会出现在我的 Azure AD 应
  • Google OAuth 2 和状态参数值需要在重定向 url 中注册

    根据 Google Oauth 2 0 文档的状态参数 指示收到响应后可能对您的应用程序有用的任何状态 Google 授权服务器会往返此参数 因此您的应用程序会收到与发送的值相同的值 可能的用途包括将用户重定向到站点中的正确资源 随机数和跨
  • 在 Azure 上运行本机代码

    我正在尝试在 Azure 上运行 C 可执行文件 我有很多workerRoles 他们不断检查作业队列 如果队列中有作业 辅助角色将根据作业类中存储的命令行参数将 C 可执行文件的实例作为进程运行 C 可执行文件通常会创建一些日志文件 我不
  • Flask+Nginx+uWSGI:导入错误:没有名为站点的模块

    我安装为http www reinbach com uwsgi nginx flask virtualenv mac os x html http www reinbach com uwsgi nginx flask virtualenv
  • 在 Postman 中请求受 Azure AD B2C 保护的 Azure 函数应用程序的访问令牌

    我有一个由 Azure Active Directory B2C 租户保护的 AspNetCore 2 0 MVC Web API 我已经能够通过以下 SO 发布使用 Postman 来测试 API 端点 在 Postman 中请求 Azu
  • 无法在 python 3.8 上将带有 webapp 的 python 部署到 azure

    我正在尝试使用部署一个测试项目Flask使用以下方法将框架迁移到 Azure 云中Azure CLI https learn microsoft com en us azure app service containers quicksta
  • Nginx 在子文件夹中重写 (404)

    我有一个网站主机NGINX曾经工作正常的服务器删除index php在 nginx 站点配置中使用try files 但现在我要在上面添加一个博客 其中 URL 将是www foo com blog 我可以访问博客并使用index php
  • 发布 Azure Webjob 时出现计划错误

    我在从 VS 2013 发布带有时间表的 Web 作业时遇到问题 我可以毫无问题地发布 按需 作业 但我希望它带有时间表 这是我在下面遇到的错误 发布时似乎找不到 Microsoft Web WebJobs Publish Tasks Cr
  • 令牌返回后,Google 操作和帐户关联失败

    尝试使用 OAuth2 授权代码流在 Web 模拟器中测试身份验证 https developers google com actions tools web simulator https developers google com ac
  • 为什么需要将nginx中的$args重定向到index.php?

    许多 PHP 框架建议将其添加到 nginx location try files uri index php is args args 执行index php在所有 HTTP 请求上 为什么我需要 is args args 我觉得 arg
  • 如何使用 Watin IE 处理 Windows 安全警报对话框

    我正在尝试使用 WatIN IE 实现网站自动化 由于该网站在几次请求后禁止该IP 因此 当IP被禁止时 我设置一个bool ipbanned true 在这种情况下 我想更改IP SetProxy 方法成功更改了 IP 地址和端口 但在下
  • 无法连接到 Azure Ubuntu VM - 公钥被拒绝

    我们在 Azure 上使用 Ubuntu VM 一段时间了 很少遇到任何问题 然而 其中一台虚拟机最近出现了问题 出乎意料的是 Ubuntu VM 开始拒绝公钥 ssh i azure key email protected cdn cgi

随机推荐