Python请求-SAML登录重定向

Python请求-SAML登录重定向,python,python-requests,saml,Python,Python Requests,Saml,我正在尝试从此URL登录到网站:。因为我使用的是学校电子邮件,所以门户会重定向到学校的登录门户,并使用该门户对登录进行身份验证。当您键入uw.edu电子邮件示例时,它会显示:myname@uw.edu. 登录后,UW使用SAMLResponse标头向发送POST请求回调。我想我需要模拟来自pollev登录页面的GET请求,然后将登录头发送到UW登录页面,但我现在所做的工作不起作用 这是我的密码: import requests with requests.session() as s:

我正在尝试从此URL登录到网站:。因为我使用的是学校电子邮件,所以门户会重定向到学校的登录门户,并使用该门户对登录进行身份验证。当您键入uw.edu电子邮件示例时,它会显示:myname@uw.edu. 登录后,UW使用SAMLResponse标头向发送POST请求回调。我想我需要模拟来自pollev登录页面的GET请求,然后将登录头发送到UW登录页面,但我现在所做的工作不起作用

这是我的密码:

import requests

with requests.session() as s:
     header_data = {
    'user - agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '
                    '(KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
    'referer': 'https://pollev.com/login'
    }
    login_data = {
    'j_username' : 'username',
    'j_password' : 'password',
    '_eventId_proceed' : 'Sign in'
    }

    r = s.get('https://idp.u.washington.edu/idp/profile/SAML2/Redirect/SSO?execution=e2s1',
          headers=header_data, data=login_data)
    print(r.text)

现在,r.text显示一个NoSuchFlowExecutionException html页面。我错过了什么?登录该网站通常需要登录名、密码、推荐人和X-CSRF令牌,我可以做到这一点,但我不知道如何导航重定向以进行身份验证。

您不会成功伪造SAML2 SSO。UW的身份提供商IdP希望支持来自服务提供商SP polleverywhere.com的身份验证请求。其中一部分是验证请求是否确实来自polleverywhere。这可能与需要来自polleverywhere的SSL连接一样简单,也可能与需要加密和签名的身份验证请求一样复杂。由于您没有这些凭据,因此生成的响应将不可读。SP向IDP注册


现在,可能有一种不同的方式登录到polleverywhere—一个不同的URL,它不会触发SSO请求,但可能受到网络限制或需要其他困难的身份验证。

这是一个老问题,但我有几乎相同的需求,一直到解决它为止。在我的情况下,可能仍然是OP的情况,我拥有所需的凭证。我相信这会变得更有效/更具吸引力,并非常感谢这些提示/更正

import re
import requests

# start HTTP request session
s = requests.Session()

# Prepare for first request - This is the ultimate target URL
url1 = '/URL/needing/shibbolethSAML/authentication'
header_data = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36'}

# Make first request
r1 = s.get(url1, headers = header_data)

# Prepare for second request - extract URL action for next POST from response, append header, and add login credentials
ss1 = re.search('action="', r1.text)
ss2 = re.search('" autocomplete', r1.text)
url2 = 'https://idp.u.washington.edu' + r1.text[ss1.span(0)[1]:ss2.span(0)[0]]
header_data.update({'Accept-Encoding': 'gzip, deflate, br', 'Content-Type': 'application/x-www-form-urlencoded'})
cred = {'j_username': 'username', 'j_password':'password', '_eventId_proceed' : 'Sign in'}

# Make second request
r2 = s.post(url2, data = cred)

# Prepare for third request - format and extract URL, RelayState, and SAMLResponse
ss3 = re.search('<form action="',r2.text) # expect only one instance of this pattern in string
ss4 = re.search('" method="post">',r2.text) # expect only one instance of this pattern in string
url3 = r2.text[ss3.span(0)[1]:ss4.span(0)[0]].replace('&#x3a;',':').replace('&#x2f;','/')

ss4 = re.search('name="RelayState" value="', r2.text) # expect only one instance of this pattern in string
ss5 = re.search('"/>', r2.text)
relaystate_value = r2.text[ss4.span(0)[1]:ss5.span(0)[0]].replace('&#x3a;',':')

ss6 = re.search('name="SAMLResponse" value="', r2.text)
ss7 = [m.span for m in re.finditer('"/>',r2.text)] # expect multiple matches with the second match being desired
saml_value = r2.text[ss6.span(0)[1]:ss7[1](0)[0]]

data = {'RelayState': relaystate_value, 'SAMLResponse': [saml_value, 'Continue']}
header_data.update({'Host': 'training.ehs.washington.edu', 'Referer': 'https://idp.u.washington.edu/', 'Connection': 'keep-alive'})

# Make third request
r3 = s.post(url3, headers=header_data, data = data)

# You should now be at the intended URL

在不了解您试图访问的系统的体系结构的情况下,我的最佳猜测是您没有模拟正确的SAML请求签名的XML交换。与SAML SSO一起工作的身份提供程序通常需要比简单GET请求更复杂的身份验证流。