1

現在、私は Facebook アプリに取り組んでおり、ASP.NET を使用して開発されています。

このアプリは、IE(7、8、および 9) FF および Chrome で正常に動作します。

最初のページは default.aspx で、認証を処理してから home.aspx にリダイレクトします。

唯一の問題は、Safari がクロスドメイン Cookie を受け入れないことです。Cookie の使用を避けるために、web.config ファイルを変更して追加しました。

その後、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('.'); 文字列encodedSignature = 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パラメータは転送されません。リダイレクト後、ページにsigned_request POSTedパラメータがなくなるため、デコードされたsigned_requestからの「parameters」変数が失われます。 。

これには2つの可能な解決策があります(私が知っていることです):

  1. Global.ascxで最初のリダイレクトをインターセプトし、代わりにURLの新しいSessionIDを使用して独自のリダイレクトを実行します...ただし、これはJavascriptの自己投稿フォームとして実行します。このフォームには、の値を持つsigned_requestパラメーターもあります。 signed_request。

  2. Cookieセッションをオンに戻し、最初のページでFBからページにリダイレクトします。このページで、Session変数(ASP.NetにセッションCookieを設定させる)を設定してから、FBにリダイレクトします。

これがタブページにもある場合は、app_dataを処理するためのコードも必要になる場合があります。

申し訳ありませんが、コードに関してこれ以上役立つことはできません。私は自分の仕事のために独自のハンドラーを作成しましたが、私の職場は現在そのコードを所有しています!どれだけ共有してもいいのかわかりません。

于 2012-04-30T06:43:14.273 に答える
0

cookieless セッションを使用しましたが、最初のページが更新されるにつれて、ランディング ページに POST された Facebook の「signed_request」が失われました。

回避策として、EndRequest() イベントをオーバーライドする HTTPModule を追加しました。ページが「初期ページ」であり、「signed_request」が含まれている場合、値はクエリ文字列として追加されます。このページでは、クエリ文字列の値を確認してセッションに設定し、アプリケーションで使用します。

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 でのセッションの問題は解決されません。

さて、SQL SessionState を設定する必要があります。これにより、アプリケーションがデータベースと通信してセッションを保存できるようになります。これは、Safari の Facebook キャンバス アプリで機能します。

これを設定するのは簡単です:

登録: aspnet_regsql.exe を実行します (C:/Windows/Microsoft.NET/Framework/'Framework version'/ にあります) https://msdn.microsoft.com/en-us/library/ms229862.aspx (メイン1 つは -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 は呼び出しを「有効な OAuth リダイレクト URI」にリダイレクトし、要求 URI の SessionId パラメータを完全に無視するため、サーバー側から facebook に WebRequests を実行してアクセス トークンを要求することはできません。API に対して WebRequest を作成することはできますが、認証は Javascript を使用して非同期にする必要があります。

于 2015-10-23T16:40:18.837 に答える