2013-03-05 147 views
0

我有刷新的infinty循環,當我嘗試與Facebook登錄我的網站上,
我已經宣佈AFER的身體標記,這是登錄與Facebook C#

  <script> 
       window.fbAsyncInit = function() { 
        FB.init({ 
         appId: '337323336385***', // App ID 
         status: true, // check login status 
         cookie: true, // enable cookies to allow the server to access the session 
         xfbml: true // parse XFBML 
        }); 

        // Additional initialization code here 
        FB.Event.subscribe('auth.authResponseChange', function (response) { 
         if (response.status === 'connected') { 
          // the user is logged in and has authenticated your 
          // app, and response.authResponse supplies 
          // the user's ID, a valid access token, a signed 
          // request, and the time the access token 
          // and signed request each expire 
          var uid = response.authResponse.userID; 
          var accessToken = response.authResponse.accessToken; 

          // TODO: Handle the access token 
          //alert("check"); 
          // Do a post to the server to finish the logon 
          // This is a form post since we don't want to use AJAX 
          var form = document.createElement("form"); 
          form.setAttribute("method", 'post'); 
          form.setAttribute("action", '/FacebookLogin.ashx'); 

          var field = document.createElement("input"); 
          field.setAttribute("type", "hidden"); 
          field.setAttribute("name", 'accessToken'); 
          field.setAttribute("value", accessToken); 
          form.appendChild(field); 

          document.body.appendChild(form); 
          form.submit(); 
         } else if (response.status === 'not_authorized') { 
          // the user is logged in to Facebook, 
          // but has not authenticated your app 
          //alert("Please "); 
         } else { 
          // the user isn't logged in to Facebook. 
          //alert("jj"); 
          alert("Please Sign into your account to access the site"); 
         } 
        }); 
       }; 

       // Load the SDK Asynchronously 
       (function (d) { 
        var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0]; 
        if (d.getElementById(id)) { return; } 
        js = d.createElement('script'); js.id = id; js.async = true; 
        js.src = "//connect.facebook.net/en_US/all.js"; 
        ref.parentNode.insertBefore(js, ref); 
       }(document)); 
      </script> 

當你看到一個腳本這個功能它調用一個C#函數,是FacebookLogin.ashx的文件,這個功能是RESPONSABLE創建包含數據的用戶

public void ProcessRequest(HttpContext context) 
{ 

    var accessToken = context.Request["accessToken"]; 
    context.Session["AccessToken"] = accessToken; 

    HttpCookie cookie = new HttpCookie("FB"); 

    string accessToken2 = context.Session["AccessToken"].ToString(); 
    Facebook.FacebookClient client = new Facebook.FacebookClient(accessToken2); 
    dynamic result = client.Get("me", new { fields = "name,id,link,gender" }); 

    cookie["FBID"] = result.id; 
    context.Response.Cookies.Add(cookie); 

    context.Response.Redirect("/login.aspx"); 
} 

在我檢查這個環節是否存在等的頁面加載會話變量變量

   string accessToken; 
       FacebookClient client; 
       dynamic result; 
       if (Session["AccessToken"] != null) 
       { 
        accessToken = Session["AccessToken"].ToString(); 
        client = new FacebookClient(accessToken); 
        result = client.Get("me", new { fields = "name,id,link,gender" }); 

        if (gb.CheckExistanceByFBID(result.id)) 
        { 
         string FBID = result.id; 
         var userDetails = context.Users.Where(x => x.FBID == FBID).Select(x => x).First(); 

         HttpCookie cookie = new HttpCookie("userData", userDetails.UserName); 
         cookie.Expires = DateTime.Now.AddMonths(2); 

         cookie["UserName"] = userDetails.UserName; 
         cookie["UserID"] = userDetails.UserID.ToString(); 
         cookie["Password"] = userDetails.Password; 
         cookie["isAdmin"] = userDetails.Admin.ToString(); 
         cookie["Name"] = userDetails.DisplayName; 
         cookie["FBID"] = userDetails.FBID; 
         Response.Cookies.Add(cookie); 
         System.Web.Security.FormsAuthentication.SetAuthCookie(userDetails.UserName, true); 
         System.Web.Security.FormsAuthentication.Timeout.Add(new TimeSpan(40, 0, 0, 0)); 
         Response.Redirect("/Default.aspx"); 
        } 
        else 
        { 
         //var accessToken = Session["AccessToken"].ToString(); 
         //var client = new FacebookClient(accessToken); 
         //dynamic result = client.Get("me", new { fields = "name,id,link,gender" }); 

         accessToken = Session["AccessToken"].ToString(); 
         client = new FacebookClient(accessToken); 
         result = client.Get("me", new { fields = "name,id,link,gender" }); 

         FBRegisterPanel.Visible = false; 
         MainRegisterPanel.Visible = true; 
         txtUserName.Text = result.name; 
        } 
       } 

問題是我點擊facebook登錄按鈕後有無限循環刷新!

回答

0

我有同樣的問題。

當login.aspx加載時,執行JS,將表單發佈到FacebookLogin.ashx,重定向到login.aspx,這意味着JS再次運行並且循環繼續。

(希望)通過執行以下操作,如果存儲了OAuth令牌,則if語句將設置爲false,因此從未執行將表單提交給FacebookLogin.ashx的腳本。

FB.Event.subscribe('auth.authResponseChange', function (response) { 
    if (response.status === 'connected' && "<%= Session["AccessToken"].ToString() %>" == "") { ... } 

注:確保會議[「的accessToken」]包含一個空字符串,即使沒有存儲訪問令牌,因爲:

  • 的JS正在尋找在會話一個空字符串[「AccessToken」]使if語句爲真。
  • 如果留空,我認爲<%= Session [「AccessToken」]。ToString()%>將拋出一個空引用異常。

    if (Session["AccessToken"] == null) 
    { 
        Session["AccessToken"] = string.Empty; 
    } 
    

您可以通過execuing這在Page_Init做到這一點