我正在使用 djangosaml2 来验证我的用户。我已经使用它很长时间了,没有任何问题。我目前正在将 Python 和 Django 升级到新版本,身份验证不再起作用。
使用日志,我看到 djangosaml2 中的身份验证成功,但在我看来,
request.user
是匿名用户。
以下是我使用的工作和非工作库版本:
附加信息:
我看到对
/saml2/acs/
的调用重定向到 /
(访问我的网站),并且响应包括 session_id
。
下一个 HTTP 调用 -
/
- 包括收到的 session_id。
但是,在数据库中我没有看到这个会话ID。 由于在数据库中找不到会话 ID,因此确实被认为是匿名的。
为什么session id没有被存储?
出现问题是因为在 saml2 中我在我的身份验证方法中删除了用户的密码(出于其他原因)。用户不知道此 PWD,因此没有造成任何伤害。
事实证明,即使用户本身不知道该 PWD,库也会创建一个用于计算会话哈希代码的密码。
会话哈希是用这个PWD计算的。与计算出的哈希值(基于用户删除的 PWD)进行比较时,结果为 False - 导致会话被刷新(并且由于没有会话,用户是匿名的)
这种行为并不新鲜。那为什么之前还能用呢?
在较旧的 Django 版本中,get_user(在
contrib.auth.init
中)用于使用以下条件检查哈希值:
if ('django.contrib.auth.middleware.SessionAuthenticationMiddleware'
in settings.MIDDLEWARE_CLASSES and
hasattr(user, 'get_session_auth_hash')):
由于未设置
SessionAuthenticationMiddleware
,因此不满足此条件,并且未检查哈希值。
在较新的版本中,此中间件已被弃用,新的
get_user
条件只是第二个:
if hasattr(user, 'get_session_auth_hash'):
导致会话验证检查哈希失败。
我更改了我的后验证方法,不删除密码,现在一切正常。
Sabito 与乌克兰站在一起
我也有同样的问题。
能具体说说你是怎么解决的吗?