简体   繁体   English

用Facebook C#登录

[英]Login with Facebook C#

I have an infinty loop of refresh when I try to log in with facebook on my site , 当我尝试使用我的网站上的facebook登录时,我有一个无限循环的刷新,
I have declared a script afer the the body tag that was 我在body标签之后声明了一个脚本

           <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>

as you see this function it's calling a C# function that's in the file of FacebookLogin.ashx this function is responsable for creating a Session variable containing the data for the user 如您所见,此函数正在调用FacebookLogin.ashx文件中的C#函数,该函数负责创建包含用户数据的Session变量

 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");
}

after that in the pageload I check for the existance of this session variable 之后,在页面加载中,我检查此会话变量是否存在

                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;
                    }
                }

the problem that I have an infinty loop of refresh after I click the facebook login button ! 单击Facebook登录按钮后,我的刷新无限循环的问题!

I had the same problem. 我有同样的问题。

When login.aspx loads, the JS is executed, which posts the form to FacebookLogin.ashx, which redirects to login.aspx, which means the JS is run again and the cycle continues. 加载login.aspx时,将执行JS,该JS将表单发布到FacebookLogin.ashx,该表单将重定向到login.aspx,这意味着JS将再次运行并继续循环。

(Hopefully) by doing the following, if an OAuth token is stored, the if-statement is made false so the script to submit the form to FacebookLogin.ashx is never executed. (希望如此)通过执行以下操作,如果存储了OAuth令牌,则将if语句设为false,因此永远不会执行将表单提交给FacebookLogin.ashx的脚本。

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

Note: make sure that Session["AccessToken"] contains an empty string even if there is no access token to store, because: 注意:即使没有要存储的访问令牌,也请确保Session [“ AccessToken”]包含空字符串,因为:

  • the JS is looking for an empty string in Session["AccessToken"] to make the if-statement true. JS在Session [“ AccessToken”]中寻找一个空字符串以使if语句为true。
  • if left null, I think <%= Session["AccessToken"].ToString() %> will throw a null reference exception. 如果为空,我认为<%= Session [“ AccessToken”]。ToString()%>将引发空引用异常。

You can do this by execuing this on Page_Init: 您可以通过在Page_Init上执行以下操作来做到这一点:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM