场景:
- 企业级、防火墙后的 Python 网络应用程序。
- 应该使用 Kerberos 对用户进行身份验证。
- 我有工作代码可以从服务器发送正确的响应(
Negotiate
header 等)并使用kerberos-sspi 获取访问应用程序的用户的 Windows 用户名
包
我对 Kerberos 没有多少经验,但对 Web 应用程序有一些经验。
在我创建的其他使用内置用户数据库的 Python 网络应用程序中,身份验证流程通常如下所示:
- 对于每个请求,检查请求是否有包含用户 ID 的(签名的)cookie(或一些变体 - 例如使用 flask-login,其中用户 id 存储在
flask.session
中) - 如果cookie存在,则正常响应。
- 如果不存在这样的 cookie,重定向到
/login/
显示用户名/密码形式。POST
到/login/
验证正确的用户名/密码,设置安全 cookie 并重定向到?next=
查询参数中指定的 URL。
我的问题是:
- 在 Kerberos 身份验证的网络应用程序中,身份验证流程是否相似?
即我应该做以下事情吗:
- 对于每个请求,检查请求是否有包含用户 ID 的(签名的)cookie
- 如果cookie存在,则正常响应。
- 如果不存在这样的 cookie,则重定向到
/login/
。/login/
做必要的事情来确定用户是谁(即发送Negotiate
header ,使用kerberos_sspi
查找用户名等.),然后设置安全 cookie 并重定向到?next=
查询参数中指定的 URL。
还是应该以其他方式处理?
最佳答案
是的,您建议的流程似乎可行。
您可以将 Kerberos 协商作为登陆 /login/
的第一件事,如果 Kerberos 同意,则将用户重定向回 session 。这甚至可以是后台的 XMLHttpRequest 并在 session 不再有效时重定向到 /login/
。如果在后台检查 session ,cookie 的生命周期可能比 Kerberos token 短得多,并且您在任何给定时间都无需担心有效 session 。
如果 session 不存在,则为用户提供 Kerberos 和其他可能的登录方法。
如果用户通过 Kerberos 进行了有效 session ,但没有用户配置文件,则将用户配置到应用程序中。在这里,您可以现场轮询用户以获取更多信息,根据组和角色做出决定,或者将用户创建为具有一组默认权限、已知缺失值的 stub ,从而推迟该过程。
这一切都非常笼统。您可能应该回顾一下您正在尝试将您的目标映射到 3A 或 AAA如身份验证、授权和计费。很明显,Kerberos 正在执行身份验证,其余角色需要确定。
关于 cookie:在您的应用程序中将任何身份验证转换为 cookie 确实有意义。这样您以后就可以在不更改整个应用程序的情况下添加一些其他的 SSO 方法。
关于windows - Web 应用程序 Kerberos 身份验证 : Is the proper way to combine with cookies?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54653735/