cesnet / simplesamlphp-module-campusmultiauth
SimpleSAMLphp 模块,提供单页密码和联邦身份验证
Requires
- php: ^8.1
- ext-curl: *
- ext-intl: *
- ext-json: *
- ext-simplexml: *
- donatj/phpuseragentparser: ^1.0
- league/commonmark: ^2.0
- simplesamlphp/composer-module-installer: ~1.0
- simplesamlphp/simplesamlphp: ^1.19
- web-token/jwt-checker: ^3.0
- web-token/jwt-core: ^3.0
- web-token/jwt-encryption-algorithm-aesgcm: ^3.0
- web-token/jwt-encryption-algorithm-aesgcmkw: ^3.0
- web-token/jwt-nested-token: ^3.0
- web-token/jwt-signature-algorithm-hmac: ^3.0
Suggests
- simplesamlphp/simplesamlphp-module-ldap: Required for timeout dialog with mitreID support
README
该项目已达到生命周期的终点,这意味着不会添加新功能。安全补丁和重要错误修复已于2024年5月结束。请查看Apereo CAS和ProxyIdP GUI。
描述
通过此模块,您可以使用saml:SP身份验证源与另一个提供基本身份验证(发现服务和登录表单显示在同一页面上)的身份验证源一起使用。
主题配置
为了正常功能,此模块需要使用名为campus
的内置主题。修改config/config.php
以包含以下行
'theme.use' => 'campusmultiauth:campus',
'usenewui' => true,
您还可以尝试使用基于Bootstrap 5的其他主题,但无法保证兼容性。
身份验证源配置
为了实现这一点,您需要在您的authsources.php文件中定义和配置一个身份验证源。下面是一个示例配置
'campus-idp' => [
'campusmultiauth:Campusidp',
'userPassSource' => [
'name' => 'campus-userpass',
'AuthnContextClassRef' => []
],
'spSource' => [
'name' => 'default-sp',
'AuthnContextClassRef' => []
]
],
以下配置选项可用
campusmultiauth:campusidp
定义要使用哪个模块和身份验证源。这是唯一必需的选项。
userPassSource
是要用于用户名和密码身份验证的身份验证源。有关与支持ECP的任何身份提供者轻松集成的说明,请参阅simplesamlphp-module-campususerpass。如果未设置名称,则默认使用campus-userpass
。
spSource
是要用于使用外部身份提供者进行身份验证的身份验证源。如果未设置名称,则默认使用default-sp
。
当然,这两个身份验证源都必须在authsources.php文件中定义。配置完成后,下一步是打开saml20-idp-hosted.php
文件,并将您的身份验证源(在我们的示例中为campus-idp
)设置为身份验证源(auth
选项)。
登录页面配置
配置的第二部分是设置登录页面本身。要配置登录页面,您需要创建一个新的配置文件module_campusmultiauth.php
。在此模块中,config-templates/module_campusmultiauth.php
中提供了示例配置。在配置文件中,有以下几个选项可用
css_framework
- 如果设置为muni_jvs
,则登录页面将在MUNI框架中显示。否则,将使用Bootstrap 5。
muni_faculty
- 仅当css_framework
设置为muni_jvs
时才相关。值可以设置为具体的学院,这将导致框架主要颜色的变化。您可以在此处找到学院及其颜色的列表。
logo
- 登录页面顶部显示的主要机构标志的URL。
name
-用作标志的替代文本。
languages
-支持的语言映射。格式是以ISO-639-1作为键的的语言代码和整个语言名称(例如,'en' => 'English'
)。如果未定义,则只支持英语。
footer
- 定义登录页面的页脚。有关如何配置页脚的进一步说明,请参阅下文中的 页脚 部分。
components
- 组件列表。这是登录页面的主要部分。每个组件代表用户的一个身份验证可能性。有关如何配置组件的进一步说明,请参阅下文中的 组件 部分。
页脚
页脚定义了登录页面的底部。如果没有设置,页脚将保持空。为了使您能够根据组织的风格定制页脚,footer
选项被设计为一个包含以下可能选项的映射:
sections
- 区段列表。每个区段代表页脚网格中的一列。这意味着,在 Bootstrap 5 中,区段的数量 必须 能被 12 整除。如果您决定使用 MUNI 框架,区段的数量 必须 能被 4 整除。每个区段包含基于 format
选项的 HTML、Markdown 或简单文本字符串。如果您想添加本地化,可以将 sections
定义为一个映射,其中语言代码作为键。然后值是包含本地化文本的区段列表。在这种情况下,您 必须 为 所有 支持的语言定义区段。
format
- 定义区段的格式。您可以将它设置为 HTML
或 markdown
。如果没有设置,区段将作为简单文本打印。
组件
登录页面的主要部分。components
选项被设计为一个列表,其中每个元素代表一个组件。组件是一个包含几个可能选项的映射。最重要的选项是 name
。它定义了组件的类型。对于 name
有三个可能的值:local_login
、searchbox
和 individual_identities
。
local_login
此组件代表一个带有用户名和密码的表单。它只能使用一次。有关“记住我”功能,请参阅下文。在模块配置中,有如下选项
username_label
- 这将在用户名输入框上方显示为标签。如果您想添加本地化,可以写值为语言代码作为键的映射和本地化字符串作为值。如果当前语言在键中未找到,则使用 第一个。如果没有设置,则显示默认值。
username_placeholder
- 这将在用户名输入框中显示为占位符。如果您想添加本地化,可以写值为语言代码作为键的映射和本地化字符串作为值。如果当前语言在键中未找到,则使用 第一个。如果没有设置,则显示默认值。
password_label
- 这将在密码输入框上方显示为标签。如果您想添加本地化,可以写值为语言代码作为键的映射和本地化字符串作为值。如果当前语言在键中未找到,则使用 第一个。如果没有设置,则显示默认值。
password_placeholder
- 这将在密码输入框中显示为占位符。如果您想添加本地化,可以写值为语言代码作为键的映射和本地化字符串作为值。如果当前语言在键中未找到,则使用 第一个。如果没有设置,则显示默认值。
entityid
- 身份提供者的 entityid。对于 idp 提示所需。
priority
- 可以设置为 primary
,默认值是 secondary
。如果您想用户在可能的情况下使用此组件,则应将其设置为 primary。
end_col
- 在桌面端,组件分为两列。如果您想使此组件成为第一列的最后一个组件,则将此选项设置为 true
。
searchbox
通过搜索框,您可以在所有包含的身份提供者之间进行搜索。此组件可以多次使用。
标题
- 组件上显示的文本。如果您想添加本地化,可以将值写成一个以语言代码为键、本地化字符串为值的映射。如果当前语言不在键中找到,则使用第一个。如果没有设置,则显示默认值。
占位符
- 在搜索框中显示的占位符文本。如果您想添加本地化,可以将值写成一个以语言代码为键、本地化字符串为值的映射。如果当前语言不在键中找到,则使用第一个。如果没有设置,则显示默认值。
过滤器
- 如果您只想显示元数据中可用的一部分身份提供者,可以使用此选项。如果没有设置,则包括元数据中的所有身份提供者。否则,显示的身份提供者将根据aarc_discovery_hint 逻辑选择。但是,有一些差异。此选项的内容已解码(这意味着它处于PHP格式,而不是JSON)。此外,您可以使用 entityid
断言(而不是 entity_category
/ assurance_certification
/ registration_authority
)来包含或排除特定的身份提供者。您可以在 module_campusmultiauth.php 配置模板中找到 entityid
断言的示例使用。
priority
- 可以设置为 primary
,默认值是 secondary
。如果您想用户在可能的情况下使用此组件,则应将其设置为 primary。
end_col
- 在桌面端,组件分为两列。如果您想使此组件成为第一列的最后一个组件,则将此选项设置为 true
。
individual_identities
在此处,您可以指定一些要显示为按钮列表的身份提供者。此组件可能被多次使用。
标题
- 组件上显示的文本。如果您想添加本地化,可以将值写成一个以语言代码为键、本地化字符串为值的映射。如果当前语言不在键中找到,则使用第一个。如果没有设置,则显示默认值。
priority
- 可以设置为 primary
,默认值是 secondary
。如果您想用户在可能的情况下使用此组件,则应将其设置为 primary。
end_col
- 在桌面端,组件分为两列。如果您想使此组件成为第一列的最后一个组件,则将此选项设置为 true
。
number_shown
- 显示多少个按钮。如果指定身份提供者的数量超过此数字,则部分身份提供者将被隐藏,并用一个按钮替换,点击该按钮将显示所有内容。
identities
- 要显示为按钮的身份提供者列表。每个身份提供者都有一些可用的配置选项。有关更多信息,请参阅下文的 identities 部分。
logos
- 可选的以实体ID为键、以URL为值的映射。此选项可用于覆盖一些预期经常使用但没有合适(方形)标志的身份提供者的标志。
identities
每个身份都是一个包含以下可能选项的映射
upstream_idp
- 身份提供者的标识符(例如 entityid)
名称
- 身份提供者的名称,作为按钮内的文本显示。如果您想添加本地化,可以将值写成一个以语言代码为键、本地化字符串为值的映射。如果当前语言不在键中找到,则使用第一个。
logo
- 身份提供者的标志,作为按钮左侧的方形显示。
背景颜色
- 标志周围的背景。定义为CSS颜色值。
记住我和安全图像
您可以在配置文件中添加 remember_me
部分,为您的 local_login
组件添加一些便利和反钓鱼功能。
记住我
要启用remember_me
复选框并将其默认设置为选中状态,请在config.php
文件中配置session.rememberme.enable
和session.rememberme.checked
选项。如果您想在复选框被选中时延长会话,请使用ExtendIdPSession身份验证进程过滤器。强烈建议同时设置会话检查函数。
您可以将有关用户的信息存储在cookie中,包括登录页面的用户访问计数器,该计数器与数据库中存储的值进行比较。这可以帮助检测一些可疑行为。要启用此功能,您必须启用上面提到的remember_me
复选框并添加RememberMe
身份验证进程过滤器。然后,在配置文件的remember_me
部分设置以下选项
nameAttr
- 包含用户名的属性的名称。必须在Authproc过滤器中的$request['attributes']
中存在。默认值为displayName
。
store
- 数据库配置,用作SimpleSAML\Database::getInstance()
方法的参数。
tokens_table
- 存储带有计数器的用户令牌的数据库表名称。默认值为cookie_counter
。
signature_key
- 用于签名JWT的密钥。
encryption_key
- 用于加密JWT的密钥。
signature_algorithm
- 签名算法,默认HS512
。
encryption_algorithm
- 加密算法,默认A256GCM
。
keywrap_algorithm
- 密钥封装算法,默认A256GCMKW
。
uid_attribute
- 用户标识符属性,默认uid
。
cipherClass
- SimpleSAML\Module\campusmultiauth\Security\Cipher
的实现,默认SimpleSAML\Module\campusmultiauth\Security\JWTCipher
。
uidName
- 此选项的值在用户uid属性值之前显示,默认值为空字符串(将不显示任何内容)。
cookieName
- 存储用户信息的cookie名称,默认campus_userinfo
。
dontCookieName
- 如果用户决定不在当前设备上记住登录,此决定也将存储到cookie中。此选项的值用作此cookie的名称。默认值是campus_dont_remember
。
安全图片
除了记住我功能外,您还可以启用安全图片。如果设置,每个用户特有的图片将显示在登录页面上,这证明了它不是一个钓鱼网站。要配置此功能,您需要将security_images
添加到remember_me
部分并设置
showFreshImage
- 如果设置为true,则每次用户访问登录页面时都会获取安全图片。否则,它将存储在cookie中。默认false
。
storageClass
- SimpleSAML\Module\campusmultiauth\Data\Storage
的实现,默认SimpleSAML\Module\campusmultiauth\Data\DatabaseStorage
。
pictureStorage
- 如果使用除SimpleSAML\Module\campusmultiauth\Data\DatabaseStorage
之外的其他存储(例如SimpleSAML\Module\campusmultiauth\Data\PerunStorage
),则此部分用于配置存储。
security.cookie.path
- cookie路径。
security.cookie.samesite
- cookie SameSite。
pictureDir
- 如果设置,则将安全图片存储在此目录中,而不是cookie中。然后,cookie中只包含图片的链接。如果启用此选项,则securityImageSalt
和pictureBaseURL
是必需的。默认null
。
securityImageSalt
- 如果启用了pictureDir
,则用于图片文件名的盐。
代码:pictureBaseURL
- 如果 pictureDir
开启,指向图片的基准 URL。
代码:pictures_table
- 存放安全图片的表名,默认为 security_image
。
代码:texts_table
- 默认 alternative_text
。您还可以为图片添加替代文本。用户可以指定自己的文本,这增加了反钓鱼功能。如果用户没有设置替代文本,alt 为空字符串。如果没有设置图片,将显示此文本。
提示
为了帮助用户选择正确的登录机构,此模块支持以下标准:
aarc_discovery_hint
(aarc_discovery_hint_uri
)
服务提供商可以选择用户应使用哪个身份提供者。如果只有一个选项,用户将直接重定向到身份提供者。否则,用户将根据 aarc_discovery_hint
参数中发送的身份提供者进行选择。除了此标准之外,服务提供商可以使用 entityid
声明(而不是 entity_category
/ assurance_certification
/ registration_authority
)来包含或排除特定的身份提供者。
aarc_idp_hint
服务提供商可以选择用户应使用哪个身份提供者,然后跳过登录页面并重定向到目标身份提供者。
idphint
服务提供商可以选择用户应使用哪个身份提供者。如果只有一个选项,用户将直接重定向到身份提供者。否则,用户将根据 idphint 参数中发送的身份提供者进行选择。
部署
最简单的方法是使用包含 SimpleSAMLphp 和 PHP-FPM 的 docker 容器,其中包含此模块。
如果想要使用非 SAML 提供商(例如 OAuth 或 OIDC),则需要提供桥梁。有多种可能的方式:
- 部署代理(例如 SATOSA),将其他认证协议转换为 SAML
- 使用 SimpleSAMLphp 的 OIDC 模块 用于 OIDC(例如 Google)
- 使用 authoauth2 模块 用于 OAuth(LinkedIn、ORCid、GitHub...)
内容安全策略
此模块不使用任何第三方 CSS、JavaScript 或字体,所有内容都捆绑在一起。仅在配置 individual_identities
组件中的 background_color
时使用内联 CSS。
外部框架
此模块使用一些外部框架/库。您可以在以下位置找到它们的完整列表