djangosaml2 对用户进行身份验证,但我在视图中看到匿名用户

问题描述 投票:0回答:2

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

使用日志,我看到 djangosaml2 中的身份验证成功,但在我看来,

request.user
是匿名用户。

以下是我使用的工作和非工作库版本:

  • Python:2.7 --> 3.8
  • Django:1.9 --> 1.11
  • djangosaml2:0.17.2(两个版本)
  • pysaml2:4.0.5 --> 6.5.1(也使用 4.0.5 进行测试)

附加信息:

我看到对

/saml2/acs/
的调用重定向到
/
(访问我的网站),并且响应包括
session_id

下一个 HTTP 调用 -

/
- 包括收到的 session_id。

但是,在数据库中我没有看到这个会话ID。 由于在数据库中找不到会话 ID,因此确实被认为是匿名的。

为什么session id没有被存储?

python django saml-2.0 django-saml2-auth
2个回答
0
投票

出现问题是因为在 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'):

导致会话验证检查哈希失败。

我更改了我的后验证方法,不删除密码,现在一切正常。


0
投票

Sabito 与乌克兰站在一起

我也有同样的问题。
能具体说说你是怎么解决的吗?

  • django版本:4.2.7
© www.soinside.com 2019 - 2024. All rights reserved.