DotNetOpenAuth OAuth2.0状态参数

时间:2012-07-17 20:20:13

标签: oauth-2.0 dotnetopenauth

我正在使用DotNetOpenAuth通过OAuth2连接到Facebook和Google。 OAuth规范要求在request_uri中不提供其他参数,Google实际上强制执行此操作,强制在您使用它们定义Google App时指定完全回调uri。

我想要完成的是在用户通过Facebook或Google验证后,能够将用户返回到特定的URL。流程就是这样,用户点击受保护的链接,然后使用returnUrl参数转发到我的登录页面,然后根据他们选择的OAuth2授权服务器启动授权过程。

由于request_uri中不能包含任何参数(尽管Facebook可以让你侥幸逃脱),我无法将returnUrl参数发送到授权服务器并将其恢复,以便当用户返回到我的时候网站,我将它们转发到他们试图访问的受保护页面。我能做的最好的事情就是将它们转发到主页或会员欢迎页面。

解决此问题的方法是使用授权服务器将发送回request_uri的“state”参数,但我找不到使用DotNetOpenAuth指定此方法的方法。

默认情况下,代码使用SessionID作为状态参数来验证从授权服务器返回的请求。在WebServerClient类上指定IClientAuthorizationTracker让我在响应从授权服务器返回时插入我的逻辑,但是在准备授权请求时没有调用它,所以我无法插入我的附加状态。

这是来自WebServerClient.cs的PrepareRequestUserAuthorization的代码:

            // Mitigate XSRF attacks by including a state value that would be unpredictable between users, but
        // verifiable for the same user/session.
        // If the host is implementing the authorization tracker though, they're handling this protection themselves.
        if (this.AuthorizationTracker == null) {
            var context = this.Channel.GetHttpContext();
            if (context.Session != null) {
                request.ClientState = context.Session.SessionID;
            } else {
                Logger.OAuth.WarnFormat("No request context discovered, so no client state parameter could be set to mitigate XSRF attacks.");
            }
        }

这里没有其他阻止,这是我希望能够播放并插入我自己的数据。

关于我缺少的任何提示?

1 个答案:

答案 0 :(得分:0)

状态参数必须专注于减轻XSRF攻击。既然您已经有了用户会话,那么您可以将returnUrl存储在会话字典中吗?

或者你可以{/ 3}与DotNetOpenAuth一起询问你是否可以将你自己的数据捆绑到state参数中(以及DNOA自己的XSRF缓解代码)。