djangosaml2 对用户进行身份验证,但在我看来我得到了匿名用户
djangosaml2 authenticates user but I get anonymous user in my view
我正在使用 djangosaml2 来验证我的用户。我已经使用它很长时间了,没有问题。我目前正在将 Python 和 Django 升级到更新版本,身份验证不再有效。
使用日志,我看到 djangosaml2 中的身份验证是成功的,但在我看来,request.user
是匿名用户。
这是我使用的工作和 none-工作库版本:
- Python: 2.7 --> 3.8
- Django:1.9 --> 1.11
- djangosaml2:0.17.2(在两个 evns 中)
- pysaml2: 4.0.5 --> 6.5.1(也用 4.0.5 测试过)
附加信息:
我看到对 /saml2/acs/
的调用重定向到 /
(访问我的站点)并且响应包括 session_id
.
下一个 HTTP 调用 - /
- 包括收到的 session_id.
但是,在数据库中我没有看到这个会话 ID。
由于在Dbase中没有找到session id,所以确实被认为是匿名的。
为什么没有存储会话 ID?
问题出现在 saml2 中,我在 post 身份验证方法中删除了用户的密码(出于其他原因)。这个 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'):
导致会话验证检查哈希并失败。
我更改了 post 身份验证方法以不删除密码,现在一切正常。
我正在使用 djangosaml2 来验证我的用户。我已经使用它很长时间了,没有问题。我目前正在将 Python 和 Django 升级到更新版本,身份验证不再有效。
使用日志,我看到 djangosaml2 中的身份验证是成功的,但在我看来,request.user
是匿名用户。
这是我使用的工作和 none-工作库版本:
- Python: 2.7 --> 3.8
- Django:1.9 --> 1.11
- djangosaml2:0.17.2(在两个 evns 中)
- pysaml2: 4.0.5 --> 6.5.1(也用 4.0.5 测试过)
附加信息:
我看到对 /saml2/acs/
的调用重定向到 /
(访问我的站点)并且响应包括 session_id
.
下一个 HTTP 调用 - /
- 包括收到的 session_id.
但是,在数据库中我没有看到这个会话 ID。 由于在Dbase中没有找到session id,所以确实被认为是匿名的。
为什么没有存储会话 ID?
问题出现在 saml2 中,我在 post 身份验证方法中删除了用户的密码(出于其他原因)。这个 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'):
导致会话验证检查哈希并失败。
我更改了 post 身份验证方法以不删除密码,现在一切正常。