FB не перенаправляет обратно на сайт ... остается на пустой странице - PullRequest
1 голос
/ 13 января 2012

Я использую пример кода из Facebook C # SDK ... в частности, проект CS-AspNetWebForms-JsSdk в качестве основы ... и я по сути скопировал Facebook> Logon.asxp и Facebook> Default.aspx вмой проект, который является модулем C # DotNetNuke.Затем я сохранил их в качестве пользовательских элементов управления.Кроме того, я не вносил никаких изменений в сам код ... (за исключением некоторых операторов using и т. Д. Для его построения в среде DNN).

Когда я запускаю предоставленный базовый пример кодав Facebook C # SDK он работает нормально.Но когда я запускаю версию в DNN, у меня возникает проблема с всплывающим окном oAuth (вызванным из Javascript), которое не закрывается и не перенаправляет обратно на мой сайт.Он просто остается открытым без отображения содержимого (пустая белая страница).

Вот первый URL-адрес, отображаемый во всплывающем окне браузера сразу после нажатия кнопки входа в FB:

https://www.facebook.com/login.php?api_key=270792352985332&skip_api_login=1&display=popup&cancel_url=https%3A%2F%2Fs-static.ak.fbcdn.net%2Fconnect%2Fxd_proxy.php%3Fversion%3D3%26error_reason%3Duser_denied%26error%3Daccess_denied%26error_description%3DThe%2Buser%2Bdenied%2Byour%2Brequest.%23cb%3Df282f9d6e4%26origin%3Dhttp%253A%252F%252Flocalhost%252Ff3ce290c44%26relation%3Dopener%26transport%3Dpostmessage%26frame%3Dfc708cc48&fbconnect=1&next=https%3A%2F%2Fwww.facebook.com%2Fdialog%2Fpermissions.request%3F_path%3Dpermissions.request%26app_id%3D270792352985332%26redirect_uri%3Dhttps%253A%252F%252Fs-static.ak.fbcdn.net%252Fconnect%252Fxd_proxy.php%253Fversion%253D3%2523cb%253Df282f9d6e4%2526origin%253Dhttp%25253A%25252F%25252Flocalhost%25252Ff3ce290c44%2526relation%253Dopener%2526transport%253Dpostmessage%2526frame%253Dfc708cc48%26sdk%3Djoey%26display%3Dpopup%26response_type%3Dtoken%252Csigned_request%26fbconnect%3D1%26perms%3Duser_about_me%252Cpublish_stream%26from_login%3D1&rcount=1

Если я использую нового пользователя (который не утвердил приложение и даже не вошел в систему), отобразится страница входа в FB, затем страница разрешений ... пока все хорошо.Но когда приходит время перенаправить обратно на мой сайт ... не повезло.Открытое окно браузера oAuth просто сидит там, с пустой страницей.Вот адрес в этом окне в то время:

https://s-static.ak.fbcdn.net/connect/xd_proxy.php?version=3#cb=f282f9d6e4&origin=http%3A%2F%2Flocalhost%2Ff3ce290c44&relation=opener&transport=postmessage&frame=fc708cc48&access_token=AAAD2SMIB8PQBAPE7Jx46Nf4aPZAeqd0iM9TibKsZAx7NajjR3U6AWomEMrX6QsplRhWNoOfuhh7wLEWCT5zQYzbYBW3DGYN7uEdS0tOqg8vXKzTQvI&expires_in=3727&signed_request=8PpxwfwmImbBT9DVjIZ5CzdtMHHu449k0OYQAoP627A.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImNvZGUiOiJBUUNsMm5OcE1vZWFuNXlOd2I0UUp6UjEyNU5mWTdJRl9VOGw0ZlZFZzI0MlhyM0Q4ZU8ycTdkdFJMc1RpbktiRUczY2JCeHBiMVNqLTdBQWtFc3NJSlUyZ0VnV2dtZHhsN21aMmUydnU4ZGNJUnJmLXdKeXdzVGl5WFpIVjA4TTJwOVNLOEZUdlFEVkhtUE15dkhOei1zOXB3MjIxVlZsQXJjZDZ1QzNLV0kwM2NFaG1UU1JjQzU4WkxIanRRZXlMYjI2MnhUd2w0azRkLXFneTEzQUZGN3IiLCJpc3N1ZWRfYXQiOjEzMjY0Nzc0NzMsInVzZXJfaWQiOiIxMDAwMDMzMzk2NDAxNjUifQ

Вот мой код:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Logon.ascx.cs"        Inherits="Incite.Modules.MySitterGetter.Logon" %>

<%--<input type="button" id="fblogin" value="Login to Facebook" disabled="disabled"/>--%>
<asp:Label ID="lblMessage" runat="server" 
Text="Please click the button below to login to Facebook."></asp:Label>
<br />
<asp:ImageButton ID="fblogin" runat="server" ImageUrl="~/DesktopModules/Incite/MySitterGetter/images/fb_login_button.jpg" Enabled="True" />
<div id="fb-root"></div>
<script>
    window.fbAsyncInit = function () {
        FB.init({
            appId: '<%: Facebook.FacebookApplication.Current.AppId %>',
            channelUrl: '<%: FBChannelURL %>', // Channel File
            cookie: true,
            xfbml: true,
            oauth: true
        });

        function facebooklogin() {
            FB.login(function (response) {
                if (response.authResponse) {    
                    // user authorized
                    window.location.reload();
                } else {
                    // user cancelled
                }
            }, { scope: '<%: string.Join(",", ExtendedPermissions) %>' });
        };

        $(function () {
            // make the button is only enabled after the facebook js sdk has been loaded.
            //$('#fblogin').attr('disabled', false).click(facebooklogin);

            $('#' + '<%= fblogin.ClientID %>').attr('disabled', false).click(facebooklogin);

        });
    };
    (function () {
        var e = document.createElement('script'); e.async = true;
        e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js';
        document.getElementById('fb-root').appendChild(e);
    } ());
</script>

И код позади:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Reflection;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using DotNetNuke;
using DotNetNuke.Common.Utilities;
using DotNetNuke.Security;
using DotNetNuke.Services.Exceptions;
using DotNetNuke.Services.Localization;
using DotNetNuke.Entities.Modules;
using DotNetNuke.Entities.Modules.Actions;

using Facebook.Web;

namespace Incite.Modules.MySitterGetter
{
public partial class Logon : PortalModuleBase
{
    protected string[] ExtendedPermissions = ConfigurationManager.AppSettings["extendedPermissions"].Split(',');
    protected string FBChannelURL = ConfigurationManager.AppSettings["fbChannelURL"];

    protected void Page_Load(object sender, EventArgs e)
    {
        if (FacebookWebContext.Current.IsAuthorized(ExtendedPermissions))
        {
            if (Request.QueryString.AllKeys.Contains("ReturnUrl"))
            {
                var returnUrl = Request.QueryString["ReturnUrl"];

                // prevent open redirection attacks
                if (IsUrlLocalToHost(Request, returnUrl))
                {
                    //Response.Redirect(returnUrl);
                    return;
                }
            }

            //Redirect to this page after login
            //Response.Redirect("~/");
            lblMessage.Text = "Successfully logged into Facebook!";
            Response.Redirect("~/FBAccount.aspx");
        }
        else
        {
            lblMessage.Text = "Facebook login FAILED!";
        }
    }

    public static bool IsUrlLocalToHost(HttpRequest request, string url)
    {
        // http://www.asp.net/mvc/tutorials/preventing-open-redirection-attacks
        if (string.IsNullOrWhiteSpace(url))
        {
            return false;
        }

        Uri absoluteUri;
        if (Uri.TryCreate(url, UriKind.Absolute, out absoluteUri))
        {
            return String.Equals(request.Url.Host, absoluteUri.Host,
                        StringComparison.OrdinalIgnoreCase);
        }
        else
        {
            bool isLocal = !url.StartsWith("http:", StringComparison.OrdinalIgnoreCase)
                && !url.StartsWith("https:", StringComparison.OrdinalIgnoreCase)
                && Uri.IsWellFormedUriString(url, UriKind.Relative);
            return isLocal;
        }
    }
 }
}

Обратите внимание на этопроисходит в Firefox, Chrome и IE9, и это все, что у меня есть.Кроме того, если я вернусь на свою страницу входа в систему (с помощью Logon.ascx) ДВАЖДЫ .... без повторного нажатия кнопки входа в FB, он пройдет проверку if (FacebookWebContext.Current.IsAuthorized (ExtendedPermissions)).Так что, хотя перенаправление не происходит, оно авторизуется.

Извините за длинный пост.Любая помощь очень ценится, поскольку я потратил на это почти день!

Чад

...