Git 通过 SAML SSO 进行 CLI 验证

Git CLI verification via SAML SSO

我正在尝试从该网络外部.

连接到在公司网络内的机器上运行的自我管理的 Gitlab 服务器

上下文

要访问此网络网络,用户需要通过反向代理并通过公司的Azure AD和SAML身份验证登录(下图)。对于 Gitlab 网络应用程序(图中左侧分支),这工作正常:在尝试访问网络时,系统会提示用户使用基于浏览器的 SSO。然后重新使用生成的令牌对 Gitlab 实例的用户进行身份验证,其中还设置了通过 Azure OAuth 进行的身份验证。

问题

问题在于使用 git cli 与 git 服务器交互(推送、拉取等)。重定向到 SSO 会触发以下错误:

> git push origin master
fatal: unable to update url base from redirection:
  asked for: https://gitserver.companyurl.com/user/repo.git/info/refs?service=git-receive-pack
   redirect: https://login.microsoftonline.com/<azure_tenant_id>/saml2?SAMLRequest=<base64encoding of SSO portal>

问题

是否可以配置 git 以触发基于浏览器的 SSO,例如git push,上面描述的重定向没有引发异常? 具体来说,以下将是理想的:

  • 用户执行了一个git push
  • 浏览器弹出,要求通过 Azure AD 进行 SSO
  • 请求'enters'公司网络
  • 理想情况下:重复使用相同的令牌对 git 服务器进行身份验证。但是,也可以使用 user:pwd 组合或访问令牌。
  • git push 次请求成功完成

我知道这在没有浏览器的无头系统上不起作用,这是可以接受的限制。

你要求的是不可能的。 Git 无法生成浏览器(因为甚至不需要安装浏览器),即使可以,也无法从它生成的浏览器中提取任何令牌或凭据。

但是,如果您可以使自定义凭据帮助程序调用所需的浏览器然后发出令牌,您可能会发现它很有用。一些环境也想为此使用 cookie,Git 可以使用 http.cookiefile 来读取 Netscape 格式的 cookie。您还可以使用 http_proxy 环境变量和用户凭据设置标准代理配置,但请注意您的代理正确使用 HTTP/1.1 并且不执行任何过滤,因为损坏的代理会损坏Git 以各种微妙的方式。

我不能代表 GitLab,但我知道 GitHub 也支持 SAML SSO built-in,因此不需要反向代理。在这种情况下,您可以继续使用个人访问令牌或 SSH 密钥访问服务器,同时仍然需要 Web 界面的 SSO。

我应该指出,一般来说,在 Git 主机前使用反向代理来限制访问可能会破坏自动化。您可能希望允许 SSH 密钥或其他一些方法来防止您的 SAML SSO 破坏与任何用户无关的自动化进程。