1

目前我正在开发一个 Facebook 应用程序,它是使用 ASP.NET 开发的。

此应用程序适用于 IE(7,8 和 9)FF 和 Chrome。

第一个页面是 default.aspx,它将处理身份验证,然后重定向到 home.aspx

现在唯一的问题是 Safari 不接受跨域 cookie。我已更改 web.config 文件并添加它以避免使用 cookie。

之后,URL 来到 http://www.testdomain.com/(S(gvsc2i45pqvzqm3lv2xoe4zm))/default.aspx

它只是不能自动从 default.aspx 重定向到 home.aspx ......

有人有线索吗?

或者,无论如何我可以在 Facebook 应用程序中使用 ASP.Net 会话处理 Safari?

非常感谢

PS。来自 default.aspx 页面的代码

protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { if (!string.IsNullOrEmpty(Request.Params["signed_request"])) { string signed_request = Request.Params["signed_request"]; if (!string.IsNullOrEmpty(signed_request)) { // 将签名请求拆分为编码签名和有效负载 string[] signedRequestParts = signed_request.Split('.'); 字符串编码签名 = signedRequestParts[0]; 字符串有效载荷 = signedRequestParts[1];

                // decode signature
                string signature = decodeSignature(encodedSignature);
                // calculate signature from payload
                string expectedSignature = hash_hmac(payload, Facebook.FacebookApplication.Current.AppSecret);

                if (signature == expectedSignature)
                {
                    // signature was not modified
                    Dictionary<string, string> parameters = DecodePayload(payload);
                    if (parameters != null)
                    {
                        string UserId = parameters["user_id"];
                        Session.Add("UserId", _SystemUser.SystemUserId);
                        Session.Add("Username", _SystemUser.Username);
                        Response.Redirect("Home.aspx?user_id=" + UserId);
                    }
                }
            }
        }

        if (!String.IsNullOrEmpty(Request["error_reason"])) // user denied your request to login
        {
            logger.Debug("Error Reason: " + Request["error_reason"]);
            //User denied access
        }

        if (String.IsNullOrEmpty(Request["code"])) // request to login
        {
            string url1 = String.Format("https://www.facebook.com/dialog/oauth?client_id={0}&redirect_uri={1}&scope={2}", Facebook.FacebookApplication.Current.AppId, callbackUrl, ext_perms);
            Response.Redirect(url1);
        }
    }
}
4

3 回答 3

1

当使用无 cookie 会话时,ASP.Net 将自动将 URL 中没有会话 ID 的任何请求重定向到同一页面,但在 URL 中使用新的 SessionID。但是,它作为 GET 请求重定向,因此不会转发任何 POSTED 参数……因此,在重定向后,您的“parameters”变量,来自解码的signed_request,将丢失,因为页面将不再具有signed_request POSTed 参数.

有两种可能的解决方案(据我所知):

  1. 拦截 Global.ascx 中的初始重定向,而是使用 URL 中的新 SessionID 进行自己的重定向...但是,在 Javascript 中作为自发布表单执行此操作,其中表单还具有带有值的 signed_request 参数签名请求。

  2. 重新打开 cookie 会话,并在您的第一页从 FB 重定向到一个页面。在这个页面中设置一个 Session 变量(它将让 ASP.Net 设置一个会话 cookie),然后重定向回 FB。

如果这也在标签页上,您可能/还需要一些代码来处理任何 app_data。

对不起,我不能更有用的代码。我已经为我的工作编写了自己的处理程序,但我的工作场所现在拥有该代码!我永远不确定可以分享多少。

于 2012-04-30T06:43:14.273 回答
0

我使用了无 cookie 会话,但随着初始页面的刷新,发布到登录页面的 Facebook“签名请求”丢失了。

作为一种解决方法,我添加了一个 HTTPModule 来覆盖 EndRequest() 事件。如果页面是“初始页面”并且包含“签名请求”POST,则该值将作为查询字符串添加。在页面中,我们将检查查询字符串值并将其设置到会话中,以便在应用程序中使用。

EndRequest 如下:

void context_EndRequest(object sender, EventArgs e)
{
    HttpContext cntxt = HttpContext.Current;
    const string paramname = "signed_request";
    const string initialPage= "/startapp.aspx";
    if ((String.Compare(cntxt.Request.Url.AbsolutePath, initialPage, true) == 0) && (!String.IsNullOrEmpty(cntxt.Request[paramname])))
    {
        string strQuerySignedReq = paramname+"=" + cntxt.Request[paramname];
        if (cntxt.Response.RedirectLocation.Contains(".aspx?"))
            cntxt.Response.RedirectLocation = cntxt.Response.RedirectLocation + "&" + strQuerySignedReq;
        else
            cntxt.Response.RedirectLocation = cntxt.Response.RedirectLocation + "?" + strQuerySignedReq;
    }
}

初始页面 - “startapp.aspx”,加载事件将是:

protected void Page_Load(object sender, EventArgs e)    
{
   signed_request = Request.QueryString["signed_request"];
}

该代码的缺点是 EndRequest() 将对所有请求执行。此外,链接只能使用相对 url。由于不同浏览器的安全级别不同,我在 cookie 和 Facebook 上有过几次烦人的经历。因此,我可以忍受这些缺点。希望这可以帮助!

于 2012-05-23T08:01:49.897 回答
0

我知道这是一个老问题,但我遇到了完全相同的问题并找到了解决方案。如果您在应用程序中使用 SQL Server,则此处的解决方案有效。

使用 cookieless 将您的 SessionId 存储在 URL 中将避免 cookie 问题,但仍然缺少 Safari 中的 Session 问题。

好吧,您需要设置一个 SQL SessionState,这将使您的应用程序与您的数据库通信以存储会话。这适用于 Safari 中的 facebook 画布应用程序。

设置这个很简单:

注册:运行aspnet_regsql.exe(在C:/Windows/Microsoft.NET/Framework/'Framework version'/)查看https://msdn.microsoft.com/en-us/library/ms229862.aspx中的参数(主是-S –ssadd)

在同一路径中,有一个 InstallSqlState.SQL 脚本。在您的数据库服务器上运行它。

现在,在您的 Web.Config 文件中设置此标记:

<configuration>
  <system.web>
    <sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" timeout="120" cookieless="true" />
  </system.web>
</configuration>

魔术完成了!

有一些事情要记住。您不能从服务器端向 facebook 执行 WebRequests 以请求访问令牌,因为 facebook 将调用重定向到“有效 OAuth 重定向 URI”,并完全忽略请求 URI 中的 SessionId 参数。您仍然可以向 API 发出 WebRequest,但身份验证需要是异步的,使用 Javascript。

于 2015-10-23T16:40:18.837 回答