cesnet/simplesamlphp-module-campusmultiauth

SimpleSAMLphp 模块,提供单页密码和联邦身份验证

v2.1.0 2022-12-01 08:57 UTC

README

maintenance status: end of life

该项目已达到生命周期的终点,这意味着不会添加新功能。安全补丁和重要错误修复已于2024年5月结束。请查看Apereo CASProxyIdP 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 - 定义区段的格式。您可以将它设置为 HTMLmarkdown。如果没有设置,区段将作为简单文本打印。

组件

登录页面的主要部分。components 选项被设计为一个列表,其中每个元素代表一个组件。组件是一个包含几个可能选项的映射。最重要的选项是 name。它定义了组件的类型。对于 name 有三个可能的值:local_loginsearchboxindividual_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.enablesession.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中只包含图片的链接。如果启用此选项,则securityImageSaltpictureBaseURL是必需的。默认null

securityImageSalt - 如果启用了pictureDir,则用于图片文件名的盐。

代码:pictureBaseURL - 如果 pictureDir 开启,指向图片的基准 URL。

代码:pictures_table - 存放安全图片的表名,默认为 security_image

代码:texts_table - 默认 alternative_text。您还可以为图片添加替代文本。用户可以指定自己的文本,这增加了反钓鱼功能。如果用户没有设置替代文本,alt 为空字符串。如果没有设置图片,将显示此文本。

提示

为了帮助用户选择正确的登录机构,此模块支持以下标准:

aarc_discovery_hintaarc_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。

外部框架

此模块使用一些外部框架/库。您可以在以下位置找到它们的完整列表