我目前正在开发一个OpenId服务器/客户端用于演示目的,我很难理解以下规范 http://openid.net/specs/openid-connect-core-1_0.html#ImplicitAuthRequest
1)clientApp向serverApp发送请求(ajax)以获取会话ID
2)clientApp使用
向serverApp发送身份验证请求(ajax){
response_type : "id_token",
scope: "openid profile",
client_id: "clientApp",
redirect_uri : "clientAppAddress/redirecturi",
state: ???,
nonce: ???
}
grant_type,username和password没有可选字段(如RFC6749:访问令牌请求)。我如何传输凭证?
此外,我不理解“国家”和“非现实”背后的概念。规范说nonce的值“需要包括每个会话状态,并且对攻击者来说是不可能的。实现此目的的一种方法是将Web服务器客户端存储为加密随机值作为HttpOnly会话cookie,并使用值的加密哈希值作为nonce参数。“,而state用于缓解CSRF,XSRF”通过以密码方式将此参数的值与浏览器cookie绑定“。它们之间的区别在哪里,它们如何提高安全性?我会使用sessionid的hash-value(存储在http only cookie中,并在第一次请求中传输给客户端)?
答案 0 :(得分:1)
验证用户的实际方法,因此传输凭据不是OpenID Connect规范的一部分。 OpenID Connect规范仅告诉您如何将有关身份验证事件和用户的信息传输给对等方。用户身份验证的方式与此无关。
state
参数用于关联请求和响应,以及在请求和响应之间共享上下文。您通常与state
关联的一个问题是用户尝试访问的URL,以便在成功进行身份验证响应后,您可以重定向到该URL。
nonce
参数用于防止重放攻击,因为该值应该被缓存。
它们一起用于防止跨站点请求伪造,攻击者抓住id_token
并尝试使用它来攻击RP,以模仿攻击者浏览器中的用户。
最好使用state
和nonce
的其他值,而不是直接从session_id
派生,因为您可能希望从同一会话重新启动身份验证,然后nonce
重放预防会阻止您重复使用它(并区分您和攻击者)。 state
也应该是不可猜测的,因此与以前在同一会话中使用的不一样。