2015-06-02 63 views
0

我目前正在开展OpenId服务器/客户端用于演示目的,我很难理解以下规范。
http://openid.net/specs/openid-connect-core-1_0.html#ImplicitAuthRequestOpenId连接隐式流与资源所有者密码证书授予

1)clientApp发送一个请求(AJAX)的serverApp以便获得一个会话ID

2)cli​​entApp发送认证请求(AJAX)的serverApp与

{ 
    response_type : "id_token", 
    scope: "openid profile",  
    client_id: "clientApp", 
    redirect_uri : "clientAppAddress/redirecturi", 
    state: ???, 
    nonce: ??? 
} 

grant_type,用户名和密码没有可选字段(如在RFC6749中:访问令牌请求)。我怎样才能传输证书?

此外,我不理解“状态”和“随机数”背后的概念。该规范指出,nonce的值“需要包含每会话状态,并且对攻击者来说是不可猜测的。为Web服务器客户端实现此目的的一种方法是将密码随机值存储为HttpOnly会话cookie,并使用该值的加密哈希值作为nonce参数“,而状态用于缓解CSRF,XSRF”通过用浏览器cookie将该参数的值加密绑定“。它们之间的区别在哪里以及它们如何提高安全性?我会使用sessionid的哈希值(存储在http only cookie中,并在第一个请求中发送给客户端)为他们两个?

回答

1

认证用户的实际方法,因此传输凭证不是OpenID Connect规范的一部分。 OpenID Connect规范仅告诉您如何将有关身份验证事件和用户的信息传输给对等方。用户认证的方式与此无关。

state参数用来关联请求和响应,并在请求和响应之间共享上下文。您通常与state关联的一件事是用户试图访问的URL,以便在成功验证响应后,您可以重定向到该URL。

nonce参数用于防止重放攻击,因为该值应该被缓存。

它们一起用于防止跨站点请求伪造,攻击者得到id_token并试图将其用于对付RP以模拟攻击者浏览器中的用户。

这将是更好地使用其他值statenonce不是直接从session_id衍生的,因为你可能希望从同一会话重新启动身份验证,然后nonce重播预防会重用它阻止你(和你的区别攻击者)。另外state应该是不可猜测的,所以与以前在同一个会话中使用的不一样。

相关问题