【发布时间】:2017-08-28 07:59:54
【问题描述】:
规范建议使用 state 参数来帮助缓解 CSRF-lie 攻击向量。但是,如果身份验证工作流是使用基于令牌的身份验证而不是基于会话的身份验证来实现的,那么考虑到无法在会话上设置状态,建议管理状态。
【问题讨论】:
标签: openid-connect
规范建议使用 state 参数来帮助缓解 CSRF-lie 攻击向量。但是,如果身份验证工作流是使用基于令牌的身份验证而不是基于会话的身份验证来实现的,那么考虑到无法在会话上设置状态,建议管理状态。
【问题讨论】:
标签: openid-connect
我知道您的问题是不使用 cookie,但由于您声明您的目标是避免后端会话,您可以向浏览器发出一个包含状态的短期签名 cookie。通过签署它,您就知道它是您发布的,并且没有被篡改。将其设为 HttpOnly 和 Secure。
我目前正在尝试使用 Express.js 进行以下操作:
const cookieParser = require('cookie-parser');
...
app.use(cookieParser('your-secret'));
在生成到授权服务器的重定向的后端代码中,我将状态存储在签名的 cookie 中,并将其包含在到授权服务器的重定向 url 中:
const state = uuidv4();
res.cookie(
'state',
state,
{
maxAge: 60 * 1000,
httpOnly: true,
secure: true,
signed: true // important
}
);
然后在您的回调处理程序中,验证 cookie 状态 (req.signedCookies.state) 是否与查询字符串参数状态 (req.query.state) 匹配,然后可选择删除 cookie 或让它自行过期。
尽管spec 说这种方法(“将此参数的值与浏览器 cookie 加密绑定”)是“典型的”,但我很难找到这样做的人。我确实找到了mod_auth_openidc,这听起来像是在这样做,但我没有深入研究它的来源:
将身份验证请求和响应关联起来的短暂“状态”cookie
你问已经一年了,如果你找到解决这个问题的其他方法,我很想听听。
【讨论】:
CSRF 涉及基于浏览器的用户代理。 state 应该以加密方式绑定到用户代理。由于基于浏览器的用户代理可用的请求/响应对上存储绑定的唯一机制是 cookie 或 HTML 存储,因此您只能使用这些选项。
【讨论】: