簡體   English   中英

使用SAML的Dropbox和Django SSO

[英]Dropbox and Django SSO using SAML

摘要
我希望通過使用來自Django站點的身份驗證來使用Dropbox SSO功能。 請注意,我希望將SAML用作Django站點的后端。

資源資源
1)Dropbox自定義SSO幫助頁面: https : //www.dropbox.com/en/help/1921#custom
2)創建SAML響應: https : //robinelvin.wordpress.com/2009/09/04/saml-with-django/
3)努力從Google中找到從事此類SSO的任何示例。 關於使用SAML作為Django后端的人們的很多鏈接。


在保管箱管理員設置中,我可以添加X509證書和登錄鏈接。 這意味着,當您嘗試使用SSO登錄到Dropbox時,它會使用帶有查詢字符串中的SAMLRequest的GET請求將您很好地轉發到我的Django站點的登錄頁面。

但是,據我了解,我現在需要在用戶在Django站點上通過身份驗證之后,在其SAML登錄鏈接中使用POST數據中的SAMLResponse將POST請求發送回Dropbox。 使用上面的第二個資源,我相信可以創建SAMLResponse xml,但是我不確定如何使用Django視圖中的SAML數據將用戶重定向到保管箱SAML登錄鏈接。

任何幫助,不勝感激。

使用django-saml2-idp設法獲得所需的功能https://github.com/peopledoc/django-saml2-idp

有關在此處安裝的良好文檔: https : //github.com/peopledoc/django-saml2-idp/blob/master/doc/INSTALL.txt

Dropbox管理控制台中的設置需要X509證書,然后將登錄URL設置為: https://****.com/idp/login

請注意,我在安裝M2Crypto依賴項時遇到問題,因此通過以下方式使用了Ubuntu軟件包:
sudo apt-get install python-m2crypto

另外,我使用的是Django 1.9.6,因此需要對views.pyurls.pyregistry.py文件進行覆蓋以使其兼容(各種import語句需要更新,並且url更改為新的列表格式,而不是使用模式)。

創建了一個Dropbox處理器,如下所示:

import base64
import zlib
from saml2idp import base
from saml2idp.xml_render import _get_assertion_xml

def get_assertion_dropbox_xml(parameters, signed=False):
    return _get_assertion_xml(ASSERTION_DROPBOX, parameters, signed)

ASSERTION_DROPBOX = (
    '<saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" '
            'ID="${ASSERTION_ID}" '
            'IssueInstant="${ISSUE_INSTANT}" '
            'Version="2.0">'
        '<saml:Issuer>${ISSUER}</saml:Issuer>'
        '${ASSERTION_SIGNATURE}'
        '${SUBJECT_STATEMENT}'
        '<saml:Conditions NotBefore="${NOT_BEFORE}" NotOnOrAfter="${NOT_ON_OR_AFTER}">'
            '<saml:AudienceRestriction>'
                '<saml:Audience>${AUDIENCE}</saml:Audience>'
            '</saml:AudienceRestriction>'
        '</saml:Conditions>'
        '<saml:AuthnStatement AuthnInstant="${AUTH_INSTANT}"'
            '>'
            '<saml:AuthnContext>'
                '<saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:Password</saml:AuthnContextClassRef>'
            '</saml:AuthnContext>'
        '</saml:AuthnStatement>'
        '${ATTRIBUTE_STATEMENT}'
    '</saml:Assertion>'
)


class Processor(base.Processor):

    def _decode_request(self):
        """
        Decodes _request_xml from _saml_request.
        """
        self._request_xml = zlib.decompress(base64.b64decode(self._saml_request), -15)

    def _format_assertion(self):
        self._assertion_xml = get_assertion_dropbox_xml(self._assertion_params, signed=False)

您在settings.py文件中注冊的內容,如下所示:

SAML2IDP_CONFIG = {
    'autosubmit': True,
    'certificate_file': '/****/certificate.pem',
    'private_key_file': '/****/private-key.pem',
    'issuer': 'https://www.****.com',
    'signing': True,
}

sampleSpConfig = {
    'acs_url': 'https://www.dropbox.com/saml_login',
    'processor': 'dropbox.Processor',
}

SAML2IDP_REMOTES = {
    'sample': sampleSpConfig,
}

像夢一樣工作。 希望這對有人有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM