使用Python脚本在ADFS上进行身份验证

时间:2019-02-27 09:59:41

标签: python parsing adfs

我需要解析被ADFS服务隐藏的站点。

并对其进行身份验证。

有什么选择可以进入吗?

我可以看到,大多数后端应用程序或“系统用户”(带有app_id,app_secret)的解决方案。 就我而言,我只能使用登录名和密码才能使用它。

问题示例: 在chrome中,我打开www.example.com,它使用登录名和密码形式将我重定向到https://login.microsoftonline.com/,然后重定向到https://federation-sts.example.com/adfs/ls/?blabla

以及如何使用python3访问它?

2 个答案:

答案 0 :(得分:5)

ADFS使用复杂的重定向和CSRF保护技术。因此,最好使用浏览器自动化工具来执行身份验证并随后解析网页。我建议将selenium toolkit与python绑定一起使用。这是一个工作示例:

from selenium import webdriver
def MS_login(usrname, passwd):  # call this with username and password
    driver = webdriver.Edge()   # change to your browser (supporting Firefox, Chrome, ...)
    driver.delete_all_cookies() # clean up the prior login sessions
    driver.get('https://login.microsoftonline.com/') # change the url to your website
    time.sleep(5) # wait for redirection and rendering

    driver.find_element_by_xpath("//input[@name='loginfmt'").send_keys(usrname)
    driver.find_element_by_xpath("//input[@type='submit']").click()
    time.sleep(5)

    driver.find_element_by_xpath("//input[@name='passwd'").send_keys(passwd)
    driver.find_element_by_xpath("//input[@name='KMSI' and @type='checkbox'").click()
    driver.find_element_by_xpath("//input[@type='submit']").click()
    time.sleep(5)

    driver.find_element_by_xpath("//input[@type='submit']").click()

    # Successfully login

    # parse the site ...

    driver.close() # close the browser
    return driver

此脚本调用Microsoft Edge打开网站。它将用户名和密码注入正确的DOM元素,然后让浏览器处理其余的内容。它已经在网页“ https://login.microsoftonline.com”上进行了测试。您可能需要对其进行修改以适合您的网站。

答案 1 :(得分:1)

要回答您的问题“如何使用python”,我假设您要在由Azure AD身份验证保护的页面上执行一些Web抓取操作。

在这种情况下,您必须执行以下步骤。

1)对于此脚本,我们只需导入以下内容:

import requests
from lxml import html

首先,我们要创建会话对象。该对象将使我们能够在所有请求中保留登录会话。

session_requests = requests.session()

第二,我们想从网页中提取csrf令牌,该令牌在登录期间使用。对于本示例,我们使用的是lxml和xpath,我们可以使用正则表达式或任何其他可提取此数据的方法。

login_url = "https://bitbucket.org/account/signin/?next=/"
result = session_requests.get(login_url)

tree = html.fromstring(result.text)
authenticity_token = list(set(tree.xpath("//input[@name='csrfmiddlewaretoken']/@value")))[0]

接下来,我们要执行登录阶段。在此阶段,我们将POST请求发送到登录URL。我们将在上一步中创建的有效负载用作数据。我们还为请求使用标头,并为相同的URL向其添加引荐关键字。

result = session_requests.post(
    login_url, 
    data = payload, 
    headers = dict(referer=login_url)
)

有效载荷将是用户名和密码等的字典对象。

payload = {
    "username": "<USER NAME>", 
    "password": "<PASSWORD>", 
    "csrfmiddlewaretoken": "<CSRF_TOKEN>"
}

注意:-这只是一个示例。

第2步:

抓取内容

现在,我们已经能够成功登录,我们将执行实际的抓取

url = 'https://bitbucket.org/dashboard/overview'
result = session_requests.get(
    url, 
    headers = dict(referer = url)
)

因此,换句话说,您需要从Azure AD获取请求详细信息有效负载,然后使用登录的方法创建会话对象,然后最后进行剪贴。

这是一个很好的Web抓取安全网站的例子。

希望有帮助。