Python 和 Selenium 的解决方法:针对 Active Directory 进行身份验证

Workaround for Python & Selenium: authenticate against Active Directory

我正在使用 Python (2.7) 和 Selenium (3.4.3) 通过 geckodriver (0.19.0) 驱动 Firefox (52.2.0 ESR) 以在 CentOS 7 机器上自动化进程。
我需要通过用户凭据完全无人值守地操作此自动化;不允许存储,也不允许闯入。
由于该过程所需的内部网站位于 Active Directory 域中,而我的自动化机器 运行 不在,这一事实引起了戏剧性的一幕。我不需要验证用户,只需将凭据以不需要人工交互或该人成为机器上的本地用户的方式传递给网站。

我已经尝试了各种排列:

其中一些似乎只能在 IE 上运行,我无法访问。
我已经检查了图书馆来处理这个问题,但都无济于事。

我可以将库添加到 python 并且我可以通过 sudo 访问机器 - 无法访问身份验证,因此无法进行 AD 集成。

我怎样才能为这个 AD 网站提供任意用户的凭据,这样就不会在本地存储他们的凭据,也不需要用户交互?

谢谢

编辑

我认为类似代理的东西可以对用户进行身份验证,然后保留该身份验证以供 selenium 执行其操作... 有没有简单的 LDAP/AD 代理可用?

编辑 2

也许一种非常简单的说明方式是我想传递用户凭据并防止出现身份验证弹出窗口。

找到的解决方案:

我需要使用浏览器扩展程序。 我的解决方案是为 chromium 构建的,但它应该几乎不变地移植到 Firefox 和 maybe edge.

首先,您需要 2 APIs 才能用于您的浏览器:

虽然两个浏览器 API 非常相似,但它们确实存在一些显着差异 - 例如 Chrome 的实现缺少 Promises

如果您将本机消息传递主机设置为发送格式正确的 JSON 字符串,则只需轮询一次。这意味着您只需调用 runtime.sendNativeMessage() 即可确保您的凭据是可解析的。双关语。

接下来,我们需要看看我们应该如何处理webRequest.onAuthRequired事件。

因为我在 Chromium 工作,所以我需要使用无承诺 Chrome API.

chrome.webRequest.onAuthRequired.addListener(
  callbackFunctionHere,
  {urls:[targetUrls]},
  ['asyncBlocking'] // --> this line is important, too. Very.

变化:

我将调用我的函数 provideCredentials 因为我是一个大偷窃者并使用了 this 来源的示例。寻找异步版本。

示例代码从 storage.local ...

获取凭据
chrome.storage.local.get(null, gotCredentials);

我们不希望那样。没有。

我们希望从对 sendNativeMessage 的单次调用中获取凭据,因此我们将更改这一行。

chrome.runtime.sendNativeMessage(hostName, { text: "Ready" }, gotCredentials);

仅此而已。严重地。只要您的 Host 表现出色,这就是大秘密。我什至不会告诉你我花了多长时间才找到它!

链接:

我的问题和有用的链接:

  • - 针对 Active Directory 进行身份验证的解决方法
  • Here - 还有一些功能性 NM 主机的工作代码
  • - 关于 promises
  • 的一些启发 material

所以这是一个不平凡的问题。

我还没有实施解决方案,但我知道如何实现...

将值传递给扩展是第一步 - 这可以在 Chrome 和 Firefox 中完成。查看版本以确保所需的 API nativeMessaging 在您的版本中实际存在。由于这个原因,我不得不改用铬。

或者,可以使用存储 API 先将值放入浏览器存储中。 [编辑:出于安全考虑,我没有这样做]

接下来是使用来自 webRequest API 的 onAuthRequired 事件。在事件上设置侦听器并传入您需要的值。


注意事项: 我已经为 nativeMessaging API 解决方案构建了扩展本身的所有内容,但让脚本识别数据仍然存在问题。这几乎可以肯定是我的 JavaScript 技能与使这些 API 变得更有意义所需的神秘知识发生冲突...... 我还没有尝试存储方法,因为它不太安全(在我看来),但它似乎更简单。