使用 Python 脚本在 ADFS 上进行身份验证
Authenticating on ADFS with Python script
我需要解析被 ADFS 服务隐藏的站点。
并努力进行身份验证。
有什么办法可以进去吗?
我所看到的,后端应用程序的大多数解决方案,或 "system users"(使用 app_id、app_secret)。
就我而言,我无法使用它,只能使用登录名和密码。
问题示例:
在 chrome
中,我打开 www.example.com
,它将我重定向到 https://login.microsoftonline.com/
,然后使用登录名和密码表单将我重定向到 https://federation-sts.example.com/adfs/ls/?blabla
。
以及如何使用 python3
访问它?
为了回答您的问题“如何使用 python”,我假设您想在受 Azure AD 身份验证保护的页面上执行一些网络抓取操作。
在这种情况下,您必须执行以下步骤。
对于这个脚本,我们只需要导入以下内容:
导入请求
从 lxml 导入 html
首先,我们要创建 session object。 object 将允许我们在所有请求中保留登录 session。
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]
接下来,我们要执行登录阶段。在这个阶段,我们向登录 url 发送一个 POST 请求。我们使用在上一步中创建的有效负载作为数据。我们还为请求使用 header 并为相同的 url.
添加一个引用密钥
result = session_requests.post(
login_url,
data = payload,
headers = dict(referer=login_url)
)
Payload 将是一个包含用户名和密码等的字典object
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 获取请求详细信息负载,然后使用登录方法创建 session object,最后执行抓取。
这是一个很好的安全网站 Web 抓取示例。
希望对您有所帮助。
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”上测试过了。您可能需要对其进行修改以适合您的网站。
我需要解析被 ADFS 服务隐藏的站点。
并努力进行身份验证。
有什么办法可以进去吗?
我所看到的,后端应用程序的大多数解决方案,或 "system users"(使用 app_id、app_secret)。 就我而言,我无法使用它,只能使用登录名和密码。
问题示例:
在 chrome
中,我打开 www.example.com
,它将我重定向到 https://login.microsoftonline.com/
,然后使用登录名和密码表单将我重定向到 https://federation-sts.example.com/adfs/ls/?blabla
。
以及如何使用 python3
访问它?
为了回答您的问题“如何使用 python”,我假设您想在受 Azure AD 身份验证保护的页面上执行一些网络抓取操作。
在这种情况下,您必须执行以下步骤。
对于这个脚本,我们只需要导入以下内容:
导入请求 从 lxml 导入 html
首先,我们要创建 session object。 object 将允许我们在所有请求中保留登录 session。
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]
接下来,我们要执行登录阶段。在这个阶段,我们向登录 url 发送一个 POST 请求。我们使用在上一步中创建的有效负载作为数据。我们还为请求使用 header 并为相同的 url.
添加一个引用密钥result = session_requests.post(
login_url,
data = payload,
headers = dict(referer=login_url)
)
Payload 将是一个包含用户名和密码等的字典object
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 获取请求详细信息负载,然后使用登录方法创建 session object,最后执行抓取。
这是一个很好的安全网站 Web 抓取示例。
希望对您有所帮助。
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”上测试过了。您可能需要对其进行修改以适合您的网站。