FacebookRedirect.axd没有保留查询字符串?

时间:2011-01-17 01:07:51

标签: facebook-c#-sdk

我正在使用fb sdk iframe canvas 4.2.1最新版本,并且当用户首次通过网址访问我的网站时,他们可以通过他们的朋友墙点击来解决问题:

http://apps.facebook.com/<mysite>/Video/View/23?ItemID=8

我授予应用程序基本权限,但返回URL如下所示:

http://apps.facebook.com/<mysite>/Video/View/23

完全切断了ItemID ???

这是SDK中的错误吗?如果是这样,我该如何解决?

我的路线设置如下:

routes.MapRoute(
"ViewItem",
"{controller}/{action}/{ItemID}/{TR}",
new { controller = "Video", action = "View", TR = UrlParameter.Optional }
);

我的控制器操作的开头如下所示:

[HttpPost]
[CanvasAuthorize]
public ActionResult View(long ItemID, long? TR)
{
...

注意:网址是通过标准方式生成的,所以请不要告诉我我的查询字符串是错误的。我正在使用Url.CanvasAction来生成网址,所以一切都很糟糕,直到用户点击并重定向以验证应用程序然后它返回时有一个放大的查询字符串。

我已经尝试单步执行代码以查看我出错的地方但找不到它,我最接近的是facebookredirect.axd文件是最后一个被调用的东西,在其中的某个地方,把它塞满了!

任何帮助或建议都将不胜感激

谢谢......

&LT;&LT;更新&gt;&gt;

我已经编写了另一个操作来检查并获取特定进程所需的权限。

[HttpPost]
public ActionResult RequestPermission(string Permission, string ReturnUrl, long? TR)
{
FacebookApp app = new FacebookApp();
var authorizer = new CanvasAuthorizer(app);

if (Permission.Length > 0)
{
authorizer.Perms = Permission;
authorizer.ReturnUrlPath = Server.UrlDecode(ReturnUrl);
authorizer.Authorize();
}
return new EmptyResult();
}

我从asp.net获得了“检测到潜在危险的请求路径”错误消息。

地址栏中的网址如下所示:

http://www.<myinternetsite>.com/facebookredirect.axd//<myfacebookapp>/http://apps.facebook.com/<myfacebookapp>/Video/View/108?perms=email&selected_profiles=55424639&session={%22session_key%22%3A%111.PfJ_2D8Q8a71orTjpzWGFQ__.3600.1295251200-763424639%22%2C%22uid%3A%22763424639%22%2C%22expires%22%3A1295251200%2C%22secret%22%3A%22Chi8iKzFqQg9zb8vdMPNag__%22%2C%22access_token%22%3A%22124828944240034|2.PfJ_2Dfdfdf1orTjpzPHFQ__.3600.4343451200-343424639|S4-dr00eU6GXUmoatU7QOWGGUVE%22%2C%22sig%22%3A%22322985031c75727b9fe31993dd2e3%22}

注意:我故意改变了上述代码和字符,以防止我的网站遭到入侵。

我在上面的网址中已经注意到的一件事是返回网址:

http://apps.facebook.com/<myfacebookapp>/Video/View/108?perms=email...

它应该读到的是:

http://apps.facebook.com/<myfacebookapp>/Video/View/108?ItemID=11&perms=email...

注意CanvasAuthorizer如何删除我的ItemID。这显然是一个错误它不应该这样做!把这件事放在一边!

也许授权者需要url编码我的returnUrl ???

这里有任何帮助???

2 个答案:

答案 0 :(得分:1)

这是Facebook登录系统的限制,而不是Facebook C#SDK。 Facebook在授权时剥离了查询字符串。当我们实现使用完整oauth 2规范的新认证系统时,这将得到修复。

答案 1 :(得分:0)

我不知道Facebook C#SDK的作者在什么时候决定这是Facebook本身的限制。仅仅为了实验,我攻击了CanvasUrlBuilder.BuildAuthReturnUrl()以包含查询而不是剥离它(“uriBuilder.Query = null; //返回网址中不允许使用查询字符串”部分。)

你能猜出发生了什么吗?有效!显然,在某些时候,返回URL会被URL编码,Facebook会愉快地传递所有查询参数。

所以,是的......

编辑: 这是修补后的方法。打开Facebook.Web.CanvasUrlBuilder并用这个替换BuildAuthReturnUrl。这样做将在FB登录和/或应用程序授权期间保留所有查询参数。我不完全确定,但是这个实现可能会破坏与在此过程中取消相关的内容,因为它完全绕过了FacebookRedirect.axd。 YMMV因为到目前为止我没有更多关于FB C#SDK的问题。

    private Uri BuildAuthReturnUrl(string pathAndQuery, bool cancel)
    {
        Contract.Ensures(Contract.Result<Uri>() != null);


        if (!string.IsNullOrEmpty(pathAndQuery) && pathAndQuery.StartsWith("/", StringComparison.Ordinal))
        {
            pathAndQuery = pathAndQuery.Substring(1);
        }

        if (pathAndQuery == null)
        {
            pathAndQuery = CurrentCanvasPathAndQuery;
        }

        string path, query;
        if (pathAndQuery.Contains('?'))
        {
            string[] strings = pathAndQuery.Split('?');
            path = strings[0];
            query = strings[1];
        }
        else
        {
            path = pathAndQuery;
            query = null;
        }

        if (!path.StartsWith("/", StringComparison.Ordinal))
        {
            path = "/" + path;
        }

        var appPath = request.ApplicationPath;
        if (appPath != "/")
        {
            appPath = string.Concat(appPath, "/");
        }

        string redirectRoot = string.Concat(redirectPath, "/", cancel ? "cancel" : string.Empty);

        UriBuilder uriBuilder = new UriBuilder("http://apps.facebook.com");
        //uriBuilder.Path = string.Concat(appPath, redirectRoot, CanvasPageApplicationPath, path);
        uriBuilder.Path = string.Concat(CanvasPageApplicationPath, path);
        uriBuilder.Query = query; // No Querystrings allowed in return urls
        return uriBuilder.Uri;
    }