Во-первых, позвольте мне решить проблему с файлами cookie. Итак, когда я говорю, чтобы не использовать куки в iFrames, я говорю это по нескольким причинам. Во-первых, в IE есть некоторые проблемы с безопасностью. Вам нужно добавить следующий заголовок в ваше приложение, чтобы куки правильно работали внутри фреймов:
P3P: CP="CAO PSA OUR"
Вторая большая проблема с файлами cookie в приложениях iframe - это Safari. Из-за настроек безопасности в Safari файлы cookie не могут быть созданы с помощью iframes. Таким образом, вы не сможете полагаться на куки для аутентификации внутри iframes.
Если вы используете приложение внутри и вне iframe, у вас должна быть включена поддержка файлов cookie. Тем не менее, ваше приложение должно быть спроектировано так, чтобы обходить проблемы iframe. Это будет трудная часть.
Самая надежная аутентификация в приложениях iframe - это метод подписанного запроса. То, что происходит, это то, что Facebook добавит параметр запроса к вашему URL, когда URL будет отображен внутри iframe. Этот параметр запроса содержит сеанс пользователя. Facebook C # SDK обрабатывает чтение для вас, так что вам не нужно анализировать его и т. Д. Но вы должны знать, что он есть. Если вы просматриваете URL-адрес входящего запроса вашего приложения iframe в Facebook, вы увидите что-то вроде http://www.mysite.com/page/?signed_request={blahblahblah}.
Таким образом, ключ заключается в том, что вам нужно убедиться, что если вы находитесь в iframe, вы сохраните это значение? Signature_request в URL.
Вы можете сделать это несколькими способами. Во-первых, вы можете использовать методы CanvasRedirect. Это методы расширения для System.Web.Mvc.Controller в пространстве имен Facebook.Web.Mvc. Переадресация холста использует JavaScript для перенаправления вашей страницы в верхний URL. Таким образом, Facebook фактически обрабатывает перенаправления и всегда добавляет подписанный запрос в ваш URL-адрес iframe. Проблема для вас в том, что этот метод перенаправления будет работать только в iframe, а не снаружи.
Вторым способом было бы вручную добавить подписанный запрос к URL при перенаправлении. Вы бы сделали что-то вроде:
public ActionResult Something () {
return RedirectToAction ("что-то", new {signature_request = Request.Querystring ["signature_requets"]);
}
Есть и другие способы, такие как хранение данных в сеансе или что-то еще, но я бы не рекомендовал идти по этому пути.
То, что вы делаете, определенно является продвинутым сенарио, но, надеюсь, вышеизложенное поможет вам двигаться в правильном направлении. Не стесняйтесь обращаться ко мне напрямую, если у вас есть какие-либо вопросы. nathan@ntotten.com или @ntotten в твиттере.