2011-01-17 6 views
0

Im используя ГФ SDk IFrame холст 4.2.1 Lastest версию и пришли acrosss проблемы с когда пользователь первым приходит на мой сайт через URL, что они могут нажать на через их друзей стене:FacebookRedirect.axd не сохраняет строку запроса?

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 генерируется с помощью стандартных средств, поэтому, пожалуйста, не говори мне, что мой QueryString неправильно. Я использую Url.CanvasAction для генерации URL-адреса, так что все доходит до того момента, когда пользователь нажимает и перенаправляется на аутентификацию приложения, после чего возвращается с выверенной кнопкой.

Я пробовал переходить через код, чтобы увидеть, где я ошибаюсь, но не могу его найти, ближайший я пришел к тому, что файл facebookredirect.axd - это последнее, что нужно назвать и где-то внутри , его начинка все это!

Любая помощь или советы будут оценены

спасибо ...

< < UPDATE >>

Я так написал еще одну акцию, чтобы проверить и получить необходимые разрешения для конкретного процесса ,

[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.

URL-адрес в адресной строке выглядит следующим образом:

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}

Примечание: Я намеренно изменил некоторые Ф.О. вышеуказанных кодов и символов, чтобы предотвратить мой сайт взломали.

Одна вещь, которую я уже могу заметить, в приведенном выше URL является возвращение URL:

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

, что он должен прочитать это:

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

уведомление, как мой ItemID удаляется CanvasAuthorizer. Очевидно, это ошибка, которой это не должно быть! Оставь френк в одиночку!

Возможно, авторизатору необходимо закодировать url мой returnUrl ???

Любая помощь здесь ???

ответ

1

Это ограничение в системе входа в систему Facebook, а не в Facebook C# SDK. Когда вы выполняете авторизацию, Facebook блокирует запросы. Это будет исправлено при внедрении новой системы аутентификации, которая использует полную спецификацию oauth 2.

0

Я понятия не имею, в какой момент авторы C# SDK Facebook решили, что это ограничение самого Facebook. Только для эксперимента я взломал CanvasUrlBuilder.BuildAuthReturnUrl(), чтобы включить запрос вместо его удаления (часть «uriBuilder.Query = null; // No Querystrings allowed in return urls»).

Можете ли вы догадаться, что произошло? Это сработало! По-видимому, в какой-то момент URL-адрес возврата получает URL-код, и Facebook счастливо передает все параметры запроса.

Так что, да ...

EDIT: Вот исправленный метод. Откройте Facebook.Web.CanvasUrlBuilder и замените BuildAuthReturnUrl этим.Это позволит сохранить все параметры запроса во время входа в систему FB и/или авторизации приложения. Я не совсем уверен, но эта реализация может сломать что-то, что связано с отменой во время процесса, поскольку оно полностью обходит FacebookRedirect.axd. YMMV, поскольку у меня больше нет проблем с SDK FB C#.

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; 
    } 
+0

Hi Stefan, можете ли вы описать больше своего решения? или отправьте мне код для изучения и использования ... спасибо! –

+0

@Pazman добавил исправленный код для вас. Нет гарантии, что это работает полностью правильно, но, надеюсь, FB SDK будет включать дух патча в конечном итоге –

Смежные вопросы