跳转到主要内容

Django的SAML 2.0身份验证

项目描述

django-mellon

Django的SAML 2.0身份验证

用法

您需要安装Lasso库的Python绑定,您可以在http://lasso.entrouvert.org/download/找到Debian的源和包。

将mellon添加到已安装的应用中

INSTALLED_APPS = (
   ...
   'mellon',
)

将SAMLBacked添加到您的身份验证后端

AUTHENTICATION_BACKENDS = (
    ...
    'mellon.backends.SAMLBackend',
)

将mellon urls添加到您的urls

urlpatterns = patterns('',
    ...
    url(r'^/accounts/mellon/', include('mellon.urls')),
)

请注意,从django 3.2开始,注册的AdminSite应用包含一个URL路由捕获所有选项(AdminSite.final_catch_all_view),该选项默认激活,并且可能会与在mellon的url路由之前声明的django-mellon应用冲突。

如果SAML 2.0应该是您唯一的身份验证方法,您可以将mellon_login定义为主要的LOGIN_URL

LOGIN_URL = 'mellon_login'
LOGOUT_URL = 'mellon_logout'

您的元数据可以通过以下HTTP地址下载:

http://whatever.example.net/accounts/mellon/metadata

如果您的身份提供者要求您的断言消费者URL,它是在

http://whatever.example.net/accounts/mellon/login

如果您的身份提供者要求您的注销URL,它是在

http://whatever.example.net/accounts/mellon/logout

会话

身份验证后,将身份验证属性存储在会话中,使用字典,键是mellon_session。该字典包含

  • issuer:身份提供者的EntityID

  • name_id_content:NameID的值

  • name_id_format:NameID的格式

  • authn_instant:在身份提供者上的身份验证的ISO8601日期,可选。

  • session_not_on_or_after:在本地会话应关闭的ISO8691日期之后。请注意,如果我们有此值,我们将自动将Django会话的过期时间设置为该值。

  • authn_context_class_ref:在身份提供者上当前身份验证的身份验证方法。您可以使用设置MELLON_AUTHN_CLASSREF来限制授权的身份验证方法。

  • 从断言中提取的所有属性。

设置

MELLON_IDENTITY_PROVIDERS之外的所有通用设置都可以通过移除MELLON_前缀在身份提供者设置中覆盖。

MELLON_IDENTITY_PROVIDERS

字典列表,它们必须包含至少一个键:METADATA(身份提供者元数据的内联副本),METADATA_URL身份提供者元数据文件的URL,或METADATA_PATH身份提供者元数据文件的绝对路径。所有其他键都是通用设置的覆盖。

当使用URL时,URL将自动缓存在应用程序的MEDIA_ROOT目录下的mellon_metadata_cache目录中。如果您重新启动应用程序且URL不可用,将使用文件缓存。缓存将在每MELLON_METADATA_CACHE_TIME秒刷新一次。如果HTTP检索元数据URL的时间超过MELLON_METADATA_HTTP_TIMEOUT秒,则跳过检索。

当缓存已加载时,检索将由线程在后台完成。

当使用本地绝对路径时,如果文件的修改时间高于上次加载时的时间,则每次都会重新加载元数据。

MELLON_PUBLIC_KEYS

此服务提供者的公钥列表,添加多个密钥以进行密钥轮换。

MELLON_PRIVATE_KEY

PKCS#8 PEM编码的私钥。如果未设置MELLON_PRIVATE_KEYS和MELLON_PRIVATE_KEY,则请求将不会被签名。

MELLON_PRIVATE_KEY_PASSWORD

如果需要,私钥的密码,默认为None。

MELLON_PRIVATE_KEYS

包含在字符串中(与MELLON_PRIVATE_KEY相同格式)或元组对(private_key, private_key_password)中的私钥列表。如果MELLON_PRIVATE_KEY为None,则将使用MELLON_PRIVATE_KEYS中的第一个密钥来签名消息。其他密钥仅用于解密加密断言。如果在MELLON_PRIVATE_KEY和MELLON_PRIVATE_KEYS中相同密钥出现两次,则第二次将忽略。如果未设置MELLON_PRIVATE_KEYS和MELLON_PRIVATE_KEY,则请求将不会被签名。

MELLON_NAME_ID_FORMATS

在元数据文件中宣传的NameID格式,默认为()。

MELLON_NAME_ID_POLICY_FORMAT

请求的NameID格式,默认为None。

MELLON_FORCE_AUTHN

是否在每个身份验证请求上强制执行身份验证,默认为False。

MELLON_ADAPTER

提供处理SAML授权、用户查找和配置方法类的列表。这些类上的可选方法包括

  • authorize(idp, saml_attributes) -> boolean

    如果任何适配器返回False,则拒绝身份验证。可以抛出PermissionDenied来在登录界面显示特定消息。

  • lookup_user(idp, saml_attributes) -> User / None

    按照设置的顺序调用每个适配器,保留第一个非None的返回值作为已验证用户。

  • provision(user, idp, saml_attributes -> None

    此方法可用于用SAML属性中的数据填充现有用户字段,或在应用程序中提供任何类型的对象。

默认适配器的设置

以下设置由默认适配器mellon.adapters.DefaultAdapter使用,如果您使用自己的适配器,则可以忽略它们。如果您的适配器继承自默认适配器,则这些设置仍然适用。

MELLON_REALM

与默认适配器创建的用户关联的默认领域,默认为‘saml’。

MELLON_PROVISION

如果用户的用户名不存在,是否创建用户,默认为True。

MELLON_USERNAME_TEMPLATE

根据接收到的属性构建和/或从其用户名检索用户的模板,语法是Python的str.format()方法的语法。可用的变量有

  • realm

  • idp(发出声明的idp的当前设置)

  • attributes

默认值是{attributes{name_id_content]}@realm

另一个示例可以是{atttributes[uid][0]},以将传递的用户名设置为新创建用户的用户名。

MELLON_ATTRIBUTE_MAPPING

根据SAML属性将模板映射到用户模型的字段。默认为{}。例如,要将标准LDAP属性复制到Django用户模型中,可以这样操作

MELLON_ATTRIBUTE_MAPPING = {
    'email': '{attributes[mail][0]',
    'first_name': '{attributes[gn][0]}',
    'last_name': '{attributes[sn][0]}',
}

MELLON_SUPERUSER_MAPPING

如果SAML属性包含特定值,将超级用户标志属性分配给用户。默认为{}。例:

MELLON_SUPERUSER_MAPPING = {
    'roles': 'Admin',
}

MELLON_AUTHN_CLASSREF

授权的认证类引用,默认为()。空值表示一切都被授权。认证类引用必须从您的身份提供者获取,但应来自SAML 2.0规范。

MELLON_GROUP_ATTRIBUTE

要将SAML属性映射到Django组名的SAML属性名称,默认为None。例:

MELLON_GROUP_ATTRIBUTE = 'role'

MELLON_CREATE_GROUP

是否创建组或仅分配现有组,默认为True。

MELLON_ERROR_URL

认证失败时继续链接的URL,默认为None。如果ERROR_URL不为空,则使用RelayState。如果没有RelayState,则使用默认的LOGIN_REDIRECT_URL(默认为/)。

MELLON_ERROR_REDIRECT_AFTER_TIMEOUT

在认证失败后自动将用户重定向到继续URL之前的时间(秒)。默认为120秒。

MELLON_VERIFY_SSL_CERTIFICATE

在执行HTTP请求时验证SSL证书,用于解析工件。默认为True。

MELLON_TRANSIENT_FEDERATION_ATTRIBUTE

当NameID格式为临时时,用于替换NameID内容的属性名称。如果没有它,则默认适配器无法使用临时NameID进行登录。默认为None。

MELLON_DEFAULT_ASSERTION_CONSUMER_BINDING

应为post或artifact。默认为post。您可以参考SAML 2.0规范了解区别。

MELLON_LOOKUP_BY_ATTRIBUTES

如果收到的NameID仍然未知,允许根据一些SAML属性查找用户。它必须是一个包含两个必填键(user_fieldsaml_attribute)的字典列表。可选键ignore-case应是一个布尔值,表示匹配是否不区分大小写(默认为尊重大小写)。

每个字典都是链接规则,应用所有规则应仅返回一个用户,规则之间应用布尔运算符OR。

例如,如果您收到一个名为email的SAML属性,并且您想链接具有相同电子邮件的用户,则可以这样配置

MELLON_LOOKUP_BY_ATTRIBUTES = [
    {
        'saml_attribute': 'email',
        'user_field': 'email',
    }
]

目标用户(s)字段应尽可能唯一,如果不是,django-mellon将拒绝链接多个符合规则的用户。

MELLON_METADATA_CACHE_TIME

当使用METADATA_URL引用元数据文件时,这是元数据文件刷新之间的持续时间(秒)。默认为3600秒,1小时。

MELLON_METADATA_HTTP_TIMEOUT

检索元数据文件时HTTP调用的超时时间(秒)。默认为10秒。

MELLON_ASSERTION_CONSUMER_BINDINGS

支持的断言消费者绑定列表。默认为

['post', 'artifact']

测试

单元测试使用pytest编写,并使用tox启动,可以使用以下命令运行

tox

代码风格

使用black格式化代码,使用以下参数

black –target-version py37 –skip-string-normalization –line-length 110

存在.pre-commit-config.yaml以使用pre-commit在提交之前自动运行black。(执行pre-commit install安装git钩子。)

isort用于格式化导入,使用以下参数

isort –profile black –line-length 110

pyupgrade用于自动升级语法,使用以下参数

pyupgrade –keep-percent-format –py37-plus

djhtml用于自动缩进HTML文件,使用以下参数

djhtml –tabwidth 2

django-upgrade用于自动升级Django语法,使用以下参数

django-upgrade –target-version 3.2

存在.pre-commit-config.yaml以使用pre-commit在提交之前自动运行这些工具。(执行pre-commit install安装git钩子。)

备注

为了尊重IdP发送的SessionNotOnOrAfter属性,您必须使用特定的SessionEngine,目前仅支持db和cached_db,等效的会话引擎包括

mellon.sessions_backends.db

mellon.sessions_backends.cached_db

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

django-mellon-1.55.tar.gz (58.4 kB 查看散列)

上传 源代码

构建分发

django_mellon-1.55-py3-none-any.whl (46.4 kB 查看散列)

上传 Python 3

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面