假设我的重定向uri和授权代码请求有效,并且我想交换令牌的有效代码,验证我在access_code请求中传递的重定向URI与授权代码中提供的相同uri匹配的好处是什么?请求?
答案 0 :(得分:1)
防止攻击者操纵身份验证请求并使授权服务器将代码发送到攻击者控制下的URL。
如果只有一个重定向URI在授权服务器上注册(最佳实践),但使用松散类型的匹配时,则无法进行此攻击。接受特定域上的任何重定向URI - 然后很可能攻击者可以操纵该域的某些部分(例如通过打开的重定向,易受攻击的wiki,论坛等等)来获取{ {1}}然后将其重播为合法客户端。使用强制重定向URI后,授权服务器在授权请求中看到的重定向URI与客户端用于令牌端点的重定向URI之间将存在不匹配。如果根本没有预先注册重定向URI,那么这种攻击就更加微不足道了。
推理是此处规范的安全注意事项的一部分:https://tools.ietf.org/html/rfc6749#section-10.6
使用授权代码授予请求授权时 类型,客户端可以通过“redirect_uri”指定重定向URI 参数。如果攻击者可以操纵
的值 重定向URI,它可以导致授权服务器重定向
资源所有者user-agent到一个受控制的URI 攻击者使用授权码。攻击者可以在合法客户端创建帐户 启动授权流程。当攻击者的用户代理是 发送到授权服务器授予访问权限,攻击者 抓取合法客户端提供的授权URI 替换
客户端的重定向URI,其URI在控制下 攻击者。然后攻击者欺骗受害者进入 操纵链接以授权访问合法客户端。
一旦到达授权服务器,受害者就会被提示 代表合法且可信赖的客户的正常有效请求,
并授权该请求。然后受害者被重定向到
具有授权的攻击者控制下的端点 码。攻击者通过发送
来完成授权流程 使用原始重定向URI的客户端授权代码 由客户提供。客户交换授权码
使用访问令牌并将其链接到攻击者的客户帐户,
现在可以访问受授权的受保护资源 受害者(通过客户)。为了防止这种攻击,授权服务器必须是 确保重定向URI用于获取授权代码 与交换
时提供的重定向URI相同 访问令牌的授权码。授权服务器
必须要求公共客户,并且应该要求机密客户 注册他们的重定向URI。如果提供了重定向URI 在请求中,授权服务器必须对其进行验证 注册价值。
答案 1 :(得分:1)
Hans Z.的答案在我阅读规范时似乎是正确的。 https://tools.ietf.org/html/rfc6749。我将尝试对相同内容的替代解释。
首先,验证码流程来自4.1节:
+----------+ | Resource | | Owner | | | +----------+ ^ | (B) +----|-----+ Client Identifier +---------------+ | -+----(A)-- & Redirection URI ---->| | | User- | | Authorization | | Agent -+----(B)-- User authenticates --->| Server | | | | | | -+----(C)-- Authorization Code ---<| | +-|----|---+ +---------------+ | | ^ v (A)' (C)' | | | | | | ^ v | | +---------+ | | | |>---(D)-- Authorization Code ---------' | | Client | & Redirection URI | | | | | |<---(E)----- Access Token -------------------' +---------+ (w/ Optional Refresh Token)
注意:说明步骤(A),(B)和(C)的线被破坏 当它们通过用户代理时分成两部分。
Figure 3: Authorization Code Flow
问题是为什么步骤(D)需要重定向URI。
谁拥有什么:
我的假设:
恶意客户公司3希望以公司2的名义访问资源所有者。
答案 2 :(得分:0)
如最后一点中的user892703所述。如果授权步骤使用客户端在其注册阶段注册的白名单uri来验证重定向uri,则在令牌获取步骤中不需要重新发送redirect_uri。