Аутентификация в ADFS с помощью скрипта Python - PullRequest
0 голосов
/ 27 февраля 2019

Мне нужно разобрать сайт, который скрыт службой ADFS.

и борется с аутентификацией к нему.

Есть ли варианты войти?

что я вижу, большинство решений для серверных приложений или для "системных пользователей" (с app_id, app_secret).в моем случае я не могу его использовать, только логин и пароль.

пример проблемы: в chrome я открываю www.example.com, и он перенаправляет меня на https://login.microsoftonline.com/, а затем на https://federation-sts.example.com/adfs/ls/?blabla с формой логина и пароля.

и как получить к нему доступ с помощью python3?

Ответы [ 2 ]

0 голосов
/ 07 марта 2019

ADFS использует сложные методы перенаправления и защиты CSRF.Таким образом, лучше использовать инструмент автоматизации браузера для выполнения аутентификации и последующего анализа веб-страницы.Я рекомендую selenium инструментарий с привязками 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". Возможно, вам придется изменить его в соответствии с вашим сайтом.

0 голосов
/ 05 марта 2019

Чтобы ответить на ваш вопрос «Как войти в Python», я предполагаю, что вы хотите выполнить некоторую операцию веб-очистки на страницах, которые защищены аутентификацией Azure AD.

В этом сценарии вы имеетечтобы сделать следующие шаги:

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, а затем создать объект сеанса, используя зарегистрированный метод, и, наконец, выполнить проверку.

Вот очень хороший пример веб-проверки защищенного веб-сайта.

Надеюсь, это поможет.

...