djangosaml2 对用户进行身份验证,但在我看来我得到了匿名用户

djangosaml2 authenticates user but I get anonymous user in my view

我正在使用 djangosaml2 来验证我的用户。我已经使用它很长时间了,没有问题。我目前正在将 Python 和 Django 升级到更新版本,身份验证不再有效。

使用日志,我看到 djangosaml2 中的身份验证是成功的,但在我看来,request.user 是匿名用户。

这是我使用的工作和 none-工作库版本:

附加信息:

我看到对 /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 身份验证方法以不删除密码,现在一切正常。