Я использую пример кода из 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)).Так что, хотя перенаправление не происходит, оно авторизуется.
Извините за длинный пост.Любая помощь очень ценится, поскольку я потратил на это почти день!
Чад