基于会话的Zope tkt身份验证
项目描述
概述
plone.session 为 Zope 站点实现了安全的会话管理。
在其默认配置中,plone.session 使用一个基于用户 ID 和 PAS 插件中存储的密钥的 HMAC SHA-256 安全加密散列来验证会话。该散列通过用户 ID 和 PAS 插件中存储的密钥生成。否则,cookie 格式与 Apache 的 mod_auth_tkt 相同。对于与原始 mod_auth_tkt 或其他兼容实现的单点登录,将 mod_auth_tkt 属性设置为 true。这将引发一个基于 MD5 的双重散列方案。您需要在所有服务器上使用相同的密钥。
与其他会话管理系统相比,这种方法具有以下优点
密码不会在每个请求中通过 cookie 发送到服务器,这与 Cookie Auth Helper 所做的方式不同。
它不需要任何 ZODB 写操作来存储会话,正如 Session Crumbler 所需要的。这使得它可以很好地扩展。
它允许您通过更新密钥来使所有现有的用户认证 cookie 失效。
cookie 仅在 timeout 属性指定的期间内有效。
这种方法也有一些缺点
如果用户的密码被更改或禁用,会话标识符将继续工作,这使得难以锁定单个用户。
用户必须启用 cookie。
会话 cookie 用于跟踪会话;这意味着只要用户保持浏览器打开(并且没有明确注销),会话就会保持打开状态,直到达到超时限制。这可以通过将插件中的 timeout 属性设置为 cookie 应在登录后保持有效的秒数来更改。
plone.session 不能 免除您为您的网站设置 TLS(也称为 HTTPS)的要求。
tktauth.py 实现了 core mod_auth_tkt 功能。它是自包含的,可能对其他框架有用。
使用 plone.session
plone.session 只负责处理已认证用户的会话。这意味着它不能单独使用:您需要一个其他 PAS 插件,例如标准的 Cookie Auth Helper 来处理认证。
用户认证后,plone.session 可以通过 PAS 的 credentials update 机制接管。
配置选项
要启用站点之间或与其他 mod_auth_tkt 系统之间的登录,通过 Zope 管理界面设置共享密钥。您可以通过同一页面管理 plone.keyring 密钥。
以下属性可以通过 属性 选项卡设置
- cookie 有效超时(以秒为单位)
之后,会话无效,用户必须重新登录。将设置为 0 以使 cookie 无限期有效。请注意,当用户文件夹启用缓存时,cookie 的有效性可能不会在每个请求上进行检查。
- 刷新间隔(以秒为单位,-1 禁用刷新)
这控制刷新 CSS max-age(见下文)。
- 使用与 mod_auth_tkt 兼容的散列算法
与其他实现的兼容性,但代价是使用更弱的散列算法。
- cookie 名称
要使用哪个 cookie。这还必须在 credentials_cookie_auth 插件上设置。
- cookie 生存期(以天为单位)
这使得 cookie 在打开和关闭浏览器之间持久。
- cookie 域(为默认值留空)
通过将Cookie域名设置为.example.com,Cookie可以在www1.example.com和www2.example.com之间共享。
- Cookie路径
Cookie设置有效的路径(默认为/)。
票据刷新
为了启用短有效期超时,您必须确保Cookie定期更新。一个选项是将mod_auth_tkt设置在您的站点之前,并设置一个TktAuthTimeoutRefresh。从plone.session 3.1版本开始,还提供了一个独立的javascript解决方案,可以作为Plone中的可选插件安装。
工作原理
可选插件安装一个CSS资源,在加载时更新Cookie。这允许每次页面加载时都更新Cookie。虽然这个CSS不能被代理服务器缓存,但它可能在客户端缓存一段时间。通过控制CSS资源的max-age,可以控制浏览器实际获取CSS的频率,从而控制Cookie更新的频率。
对于短超时(例如15或30分钟),用户在Cookie失效之前可能还没有加载新页面。包含了一个javascript,它会在用户在页面上活跃时(如按键或鼠标移动)定期轮询Cookie刷新CSS。如果刷新CSS的最大年龄已过,则浏览器将重新获取CSS,并更新Cookie。轮询间隔可以在刷新CSS查询字符串的minutes参数中配置,默认为5分钟。
票据删除
当登录会话跨域名共享时,当用户从Plone站点注销时,注销所有域名可能会有所帮助。在/logged_out页面上加载伪CSShttp://example.com/portal_path/acl_users/session/remove?type=css以删除票据。
与IIS的单点登录
对于有Windows域用户的内网设置,可以配置IIS使用集成Windows身份验证作为外部登录提供者,即使对于运行在Linux/Unix服务器上的站点。
要求
您需要一个运行IIS的Microsoft Windows服务器。最好是Windows Server 2003或更高版本。
服务器必须是您想要验证用户所在的Windows域的成员。它本身不需要是Active Directory服务器。
您的站点应该使用pas.plugins.ldap来使用与用户源相同的Active Directory。
Python
Windows服务器需要安装Python 2.7和Python Win 32扩展构建>=216。
将tktauth.py(从本包的plone/session中)的副本放入
C:\Python26\Lib\site-packages\
按照如何为IIS配置Python的说明进行操作。在第二点2.d中使用
Executable: "C:\Python27\python.exe -u %s %s"
代替。这将确保文件以通用换行模式打开。您可以选择只为特定的网站而不是整个IIS配置这些设置。相应地调整设置,并首先详细创建网站,如下一章所述。
IIS
找到并打开IIS管理控制台。
通过进入Web Sites文件夹并使用右键菜单创建一个新的Web Site。您应该会得到一个向导,要求您回答各种问题
Description: SSO login service TCP port: 80 Path: c:\Inetpub\sso Allow anonymous access to this Web site: <not checked> Permissions: Read, Run scripts, Execute
如果您正在运行IIS 6,您需要转到Web服务扩展文件夹,将Active Server Pages设置为允许。否则,您将得到相当无用的404未找到错误,针对asp脚本。
IIS脚本
将login.asp和test.asp脚本(从本包的iis-login文件夹中)复制到网站的根路径(例如C:\Inetpub\sso)。
您需要修改login.asp中找到的SECRET常量,以与在plone.session的管理密钥选项卡上设置的相同共享密钥。
修改login.asp中的ALLOWED_SITES常量,包括您Plone站点的URL。
修改login.asp中的DEFAULT_NEXT常量,使其指向您Plone站点之一的logged_in URL。
通过访问http://LOGONSERVER/test.asp来确认访问权限已正确配置。
配置浏览器以允许自动登录
浏览器必须配置为信任登录服务器,以便自动发送用户认证数据。
默认情况下,Internet Explorer会将登录信息发送到位于Intranet区域内的服务器,只要使用它的内部名称访问该站点(例如http://LOGONSERVER/login.asp)。如果使用完全限定的域名或IP地址访问该站点,则必须将其明确添加到受信任站点列表中。
Firefox配置信息可在此文章中找到。
配置您的Plone站点
请确保您已设置Active Directory认证,并且可以使用您的当前Windows用户名登录。
通过Zope界面设置以下配置选项
在/Plone/acl_users/session中。在管理密钥选项卡上设置共享密钥。
在/Plone/portal_properties/site_properties中设置external_login_url为http://LOGONSERVER/login.asp。
在/Plone/portal_properties/site_properties中设置external_login_iframe为true。
针对在Windows XP下进行测试的开发者说明
IIS可以使用Windows XP安装CD作为附加组件安装。
IIS管理控制台位于
Start -> Control Panel -> Administrative Tools -> Internet Information Services
pywin32安装程序已为我配置IIS,因此无需遵循如何配置Python以用于IIS的说明。
我找不到如何设置单独的站点,因此将asp脚本直接放在C:\Inetpub\wwwroot - 默认网站
从IIS管理控制台,选择“默认网站”。您应该在右侧窗格中看到login.asp和test.asp。对于每个文件,右键单击“属性”。在文件安全选项卡上,单击匿名访问和身份验证控制的“编辑…”。取消选中匿名访问并选中基本身份验证(作为后备使用)和集成Windows身份验证。
通过访问https://#/test.asp来确认IIS认证按预期工作。
在login.asp和plone.session的管理密钥中设置密钥。
将login.asp中的SITE_URL设置为https://#:8080/Plone(或您的站点的地址)。
添加一个与您的Windows登录名相同的Plone用户(例如:管理员),这可以避免设置Active Directory。
按照上面的部分配置您的Plone站点,但将登录表单设置为https://#/login.asp。
变更日志
4.0.4 (2023-09-08)
错误修复
密码重置后不要设置认证cookie,除非用户已认证。否则匿名用户将被立即登录,即使密码重置后自动登录为false。修复问题3835。[maurits] (#3835)
内部
更新配置文件。[plone devs] (7723aeaf)
4.0.3 (2023-03-21)
错误修复
移除对Products.CMFPlone的循环依赖。使用从plone.base移动的导入。[jensens] (#38)
内部
更新配置文件。[plone devs] (a533099d)
4.0.2 (2023-02-07)
错误修复
声明所有依赖。[gforcada] (#1)
4.0.1 (2023-01-30)
内部
更新代码以符合当前Plone元标准。[gforcada, maurits] (#1)
4.0.0 (2022-12-02)
错误修复
Plone 6.0.0的最终版本 (#600)
4.0.0b2 (2022-08-31)
新功能
创建每个用户的密钥环,以便在注销时进行会话失效(服务器端注销)。[david-batranu] (#26)
将Cookie属性SameSite设置为“Lax”。(#29)
4.0.0b1 (2022-07-22)
错误修复
将plone-session包更新为依赖于plone包而不是不再存在的jquery包。[davisagli] (#27)
4.0.0a1 (2022-04-08)
重大更改
为Plone 6注册单个资源包以支持我们的可选刷新功能。plone.app.upgrade中包含此升级步骤,否则我们将留下部分包。移除我们自己的升级步骤和配置文件,因为在从Plone 5.2迁移时不再需要。[maurits] (#24)
3.7.5 (2020-06-24)
错误修复
修复与Products.CMFPlone的硬依赖间接引用(plone.session不得从中导入)。[jensens] (#20)
仅在当前用户是请求的用户时设置会话。[maurits] (#57)
3.7.4 (2020-04-22)
错误修复
小型的打包更新。(#1)
3.7.3 (2019-04-29)
错误修复
修复由重命名profiles.py到hiddenprofiles.py引起的名称冲突。[jensens] (#16)
3.7.2 (2019-02-13)
错误修复
移除ZopeTestCase的最后痕迹。[gforcada] (#14)
3.7.1 (2018-09-28)
错误修复
Python3兼容性 [ale-rt, pbauer]
3.7.0 (2018-04-03)
新功能
使用资源注册表进行JS/CSS注册 [jensens]
错误修复
修复#11:伪CSS文件不再在合并的遗留包中加载。现在可选的基于JS的自动刷新支持再次工作。[jensens]
现代化README。[jensens]
3.6.2 (2018-02-02)
错误修复
加强默认会话超时。这解决了Plone安全内部问题#126(严重程度低,非关键)。现在会话超时与mod_auth_tkt相同:2小时。这遵循德国BSI(信息技术安全联邦办公室)的建议。有关现有站点的信息,请在此处进行调整:https://HOST/acl_users/session/manage_propertiesForm Plone安全团队遵循BSI并建议管理员更改其现有Plone站点的设置。[jensens]
添加Python 2 / 3兼容性 [vincero]
3.6.1 (2016-12-02)
错误修复
在安装列表中隐藏卸载配置文件。[jensens]
3.6.0 (2016-05-26)
新
添加卸载配置文件。[maurits]
3.5.6 (2015-07-27)
清理:Pep8、plone风格约定、更好的可读性。[jensens]
3.5.5 (2015-04-29)
createTicket的默认编码以与unicode用户_id兼容。[puittenbroek]
3.5.4 (2015-03-21)
将测试从PloneTestCase移动到plone.app.testing。[tomgross]
3.5.3 (2013-03-05)
撤销对validateTicket默认编码的意外更改。[davisagli]
3.5.2 (2012-12-09)
在验证票据时使用恒定时间比较。这是修复https://plone.org/products/plone/security/advisories/20121106/23的一部分。[davisagli]
3.5.1 - 2012-11-02
处理用户id的编码字符串。[elro]
添加MANIFEST.in。[WouterVH]
修复在64位Mac OS下使用Python 2.4生成不正确mod_auth_tkt散列的问题。[MatthewWilkes]
3.5 - 2011-03-19
在开发模式下禁用安全Cookie,以便于本地测试。[hannosch]
3.4 - 2011-03-02
将metadata.xml添加到默认配置文件。[vincentfretin]
3.3 - 2010-12-30
更新login.asp以匹配Plone 4.1 SSO登录表单功能。[elro]
修复删除功能。[elro]
3.2 - 2010-12-14
移除external_login方法,可以使用正常的logged_in脚本。[elro]
修复刷新功能。[elro]
3.1 - 2010-11-11
移除SessionPlugin.validate(ticket)方法,它不再需要。[elro]
3.1b1 - 2010-10-18
会话刷新。[elro]
SessionPlugin.validate(ticket)方法。[elro]
正确关闭<input>标签(chameleon兼容性)[swampmonkey]
3.0 - 2010-07-18
更新包元数据。[hannosch]
3.0b5 - 2010-06-13
确保加载正确的元ZCML。[hannosch]
避免在Zope 2.13下的弃用警告。[hannosch]
移除对GPL许可证的Products.PloneTestCase的依赖。[hannosch]
3.0b4 - 2010-05-23
使Cookie的secure选项可配置。这允许将Cookie限制为仅HTTPS连接。这解决了http://dev.plone.org/plone/ticket/7897。[pfurman, hannosch]
使用标准库的doctest模块,而不是zope.testing中已弃用的模块。[hannosch]
将会话Cookie标记为HTTPOnly。[hannosch]
PEP8清理。[hannosch]
根据PF董事会决定重新授权为BSD。http://lists.plone.org/pipermail/membership/2010-April/001123.html [elro]
3.0b3 - 2010-04-09
示例IIS登录表单和文档。这是基于Hanno和我为Centrepoint在Jarn的工作。[elro]
支持通过外部表单进行身份验证,可能是运行在IIS服务器上并使用集成Windows身份验证的表单。[elro]
3.0b2 - 2010-03-09
将setupSession前缀设置为下划线,该方法不应在TTW中可用。[elro]
在authenticateCredentials中捕获ComponentLookupError。[elro]
3.0b1 - 2010-03-05
添加回带有设置共享密钥功能的哈希管理UI。[elro]
添加cookie域和ticket有效期超时属性。[elro]
使用mod_auth_tkt格式cookie来为我们提供会话有效期超时。默认情况下,我们使用更安全的HMAC SHA-256哈希方案。一个与其它mod_auth_tkt实现兼容的基于MD5的方案是可选的。[elro]
移除源组件间接引用。[elro]
3.0a2 - 2009-11-13
移除意外重新合并的哈希管理UI。[davisagli]
3.0a1 - 2009-04-04
避免在Python 2.6中对sha模块的弃用警告。[hannosch]
在额外中声明测试依赖。[hannosch]
指定包依赖关系。[hannosch]
修复了与新的keyring后端一起工作的剩余测试。[hannosch]
修复了HashSession源中的组件查找调用。[davisagli, hannosch]
更新默认(哈希)会话源以使用plone.keyring来管理秘密。[wichert]
2.1 - 2009-02-04
使用ManageUsers权限保护setupSession调用。修复了可能的权限提升。[maurits]
使cookie有效期可配置。由Rok Garbas提供的补丁。修复了http://dev.plone.org/plone/ticket/7248 [wichert, garbas]
2.0 - 2008-07-08
修复了通过PAS的Plone会话插件管理服务器秘密的CSRF保护。修复了http://dev.plone.org/plone/ticket/8176 [witsch]
1.2 - 2007-02-15
使用binascii base64方法对会话Cookie进行编码/解码。这可以防止在长cookie中插入换行符。[wichert]
1.1 - 2007-09-11
在会话标识符中使用用户ID而不是登录名。这有一个副作用,即解决了一个PAS中的bug,该bug导致当使用的登录名与另一个登录名不完全匹配时,我们将用户混淆。[wichert]
1.0 - 2007-08-15
第一个稳定版本 [wichert]
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。