django的saml 2.0身份提供程序
djangosaml2idp的Python项目详细描述
djangosaml2idp
djangosaml2idp为django实现saml2协议的身份提供者端。 它构建在PySAML2之上,并且可以投入生产。
包版本0.3.3是最后一个与Python2/django 1.8-1.11兼容的版本。从0.4.0开始的版本适用于python 3和django 2.x。
任何贡献,功能要求,建议,想法…欢迎!有关一些信息,请参见CONTRIBUTING document。
安装
pysaml2使用XML Security Library二进制文件对saml断言进行签名,因此需要安装 它可以通过操作系统包,也可以通过编译源代码。最终可执行文件安装在哪里并不重要,因为 您需要在配置阶段设置到它的完整路径。xmlsec(至少)可用于debian、osx和alpinlinux。
现在可以使用pip安装djangosaml2idp包。这也将自动安装pysaml2及其依赖项:
pip install djangosaml2idp
配置和使用
您需要做的第一件事是将djangosaml2idp添加到已安装的应用程序列表:
INSTALLED_APPS = ( 'django.contrib.admin', 'djangosaml2idp', ... )
现在将djangosaml2idp添加到url配置中,将其包括在项目中:
from django.conf.urls import url, include from django.contrib import admin urlpatterns = [ url(r'^idp/', include('djangosaml2idp.urls')), url(r'^admin/', admin.site.urls), ... ]
在django设置中,配置idp。配置遵循PySAML2 configuration。示例项目中的idp如下所示:
... import saml2 from saml2.saml import NAMEID_FORMAT_EMAILADDRESS, NAMEID_FORMAT_UNSPECIFIED from saml2.sigver import get_xmlsec_binary LOGIN_URL = '/login/' BASE_URL = 'http://localhost:9000/idp' SAML_IDP_CONFIG = { 'debug' : DEBUG, 'xmlsec_binary': get_xmlsec_binary(['/opt/local/bin', '/usr/bin/xmlsec1']), 'entityid': '%s/metadata' % BASE_URL, 'description': 'Example IdP setup', 'service': { 'idp': { 'name': 'Django localhost IdP', 'endpoints': { 'single_sign_on_service': [ ('%s/sso/post' % BASE_URL, saml2.BINDING_HTTP_POST), ('%s/sso/redirect' % BASE_URL, saml2.BINDING_HTTP_REDIRECT), ], }, 'name_id_format': [NAMEID_FORMAT_EMAILADDRESS, NAMEID_FORMAT_UNSPECIFIED], 'sign_response': True, 'sign_assertion': True, }, }, 'metadata': { 'local': [os.path.join(os.path.join(os.path.join(BASE_DIR, 'idp'), 'saml2_config'), 'sp_metadata.xml')], }, # Signing 'key_file': BASE_DIR + '/certificates/private.key', 'cert_file': BASE_DIR + '/certificates/public.cert', # Encryption 'encryption_keypairs': [{ 'key_file': BASE_DIR + '/certificates/private.key', 'cert_file': BASE_DIR + '/certificates/public.cert', }], 'valid_for': 365 * 24, }
注意,配置要求文件系统上有一个私钥和公共证书,以便对消息进行签名和加密。
您还必须为与之交谈的每个SP定义一个映射:
... SAML_IDP_SPCONFIG = { 'http://localhost:8000/saml2/metadata/': { 'processor': 'djangosaml2idp.processors.BaseProcessor', 'attribute_mapping': { # DJANGO: SAML 'email': 'email', 'first_name': 'first_name', 'last_name': 'last_name', 'is_staff': 'is_staff', 'is_superuser': 'is_superuser', } } }
这就是IDP配置的全部内容。假设您在localhost:8000上运行django开发服务器,那么您可以通过访问http://localhost:8000/idp/metadata/获取其元数据。 使用此元数据XML配置您的SP。将来自该SP的元数据XML放在config dict中指定的位置(上面示例中的sp_metadata.xml)。
更多可选配置选项
在SAML_IDP_SPCONFIG设置中,您可以定义一个processor,它的值是一个带有指向类的虚线路径的字符串。 这是一个钩子,用于自定义一些访问控制检查。默认情况下,使用包含的baseprocessor,允许每个用户登录idp。 您可以通过子类化baseprocessor并重写其has\u access(self,request)方法自定义此行为。此方法应返回true或false,具体取决于用户是否有权登录sp/idp。 处理器的sp entity id可用作self.\u entity\u id,并接收请求(带有经过身份验证的请求。用户)作为has\u access函数的参数。 这样,你应该有必要的灵活性来执行你需要的任何检查。 示例processor subclass可以在包含的示例的idp中找到。
如果没有自定义设置,用户将由您使用的用户模型上的USERNAME_FIELD属性标识。按django默认值,这将是用户名。 通过将SAML_IDP_DJANGO_USERNAME_FIELD添加到设置中,并将属性作为值用于用户实例,可以自定义用于标识符的字段。
自定义错误处理
如果遇到错误,djangosaml2idp将呈现一个非常基本的错误页,指示发生了错误、发生了哪个错误,可能还会显示一条额外的消息。 如果可能,还将根据发生的错误设置http状态代码。 您可以使用SAML_IDP_ERROR_VIEW_CLASS设置自定义此设置。将此设置为自定义(基于类)视图的点式导入路径,以便使用该视图。 如果将提供的djangosaml2idp.error\views.samlidperrorview子类化,则可以在模板中使用以下变量:
- 异常类型
- 发生的异常的类
- 异常消息
- 来自异常的消息(通过执行除外))
- 附加信息
- 如果没有给出特定的异常,则会出现一条指示出错的消息,或在异常消息旁边出现一条附加消息
最简单的重写是将samlidperrorview子类化,并且只使用您自己的错误模板。 您可以为此使用任何基于类的视图;不必对内置错误视图进行子类化。 示例项目包含一个现成的示例;取消注释saml_idp_error_view_class设置,它将使用带有自定义模板的自定义视图。
多因素身份验证支持
增加多因素支持有三个主要组成部分。
- 如上所述的djangosaml2idp.processors.baseprocessor子类。您需要重写enable_multifactor()方法来检查是否应该为用户启用multifactor。(如果所有用户都应该启用它,那么只需将硬代码设置为true)。默认情况下,它无条件返回false,并且不强制执行多因素。
- 子类化djangosaml2idp.views.processmultifatorview视图,为您的环境进行适当的调用。在multifactor\u is\u valid方法中实现您的自定义验证逻辑:这可以调用帮助程序脚本、内部短信触发服务、只有idp可以访问的数据源或外部第二因素提供程序(例如,赛门铁克VIP)。默认情况下,此视图将记录它已被调用,然后重定向。
- 更新urls.py并为name='saml_multi_factor'添加一个覆盖-确保它在导入djangosaml2idp url文件之前出现,以便使用自定义视图而不是内置视图。
运行测试套件
在requirements-dev.txt:
中安装开发依赖项pip install -r requirements-dev.txt
从项目根目录运行py.test:
py.test
示例项目
目录example_project包含演示登录注销功能的赤骨演示设置。 它由使用djangosaml2实现的服务提供者和使用djangosaml2idp实现的标识提供者组成。 该文件夹中的自述文件包含有关如何运行它的更多信息。