Возникли проблемы при входе в Facebook - PullRequest
1 голос
/ 27 марта 2012

Просто начинаю создавать приложение, используя v6 в facebook c # sdk, и застрял в процессе входа в Facebook. У меня есть следующий код на моей странице:

    string client_id = ConfigurationManager.AppSettings["APIKey"].ToString();
    string client_secret = ConfigurationManager.AppSettings["Secret"].ToString();
    string redirect_uri = ConfigurationManager.AppSettings["Url"].ToString() + "default2.aspx";

    FacebookClient objClient = new FacebookClient();

    var fbLoginUrl = objClient.GetLoginUrl(new { client_id = client_id, 
                                                 client_secret = client_secret, 
                                                 redirect_uri = redirect_uri, 
                                                 response_type = "code",
                                                 display = "popup",
                                                 scope = "manage_pages,publish_stream,read_stream", 
                                                 state = "" });
    //msg.Text = fbLoginUrl.ToString();
    Response.Redirect(fbLoginUrl.ToString());

Когда я перехожу на страницу, перенаправление для входа никогда не происходит. Что я делаю не так?

1 Ответ

1 голос
/ 29 марта 2012

С MVC 3 (посмотрите на опубликованный пример) я делаю вид, с которого начинается вход в систему. Контроллер:

        public ActionResult Logon()
    {
        _fb = new FacebookClient();

        var csrfToken = Guid.NewGuid().ToString();
        Session["fb_csrf_token"] = csrfToken;

        var state = Convert.ToBase64String(Encoding.UTF8.GetBytes(_fb.SerializeJson(new { returnUrl = returnUrl, csrf = csrfToken })));

        var fbLoginUrl = _fb.GetLoginUrl(
            new
            {
                client_id = AppId,
                client_secret = Appsecret,
                redirect_uri = RedirectUri,
                response_type = "code",
                scope = Scope,
                state = state
            });
        return Redirect(fbLoginUrl.AbsoluteUri);
    }

где returnUrl - это область подключенного просмотра в моем приложении (/ home / fbhome), а RedirectUri - это представление (loginresult), которое будет выполнять второй шаг:

        public ActionResult Loginresult(string code, string state)
    {
        if (string.IsNullOrWhiteSpace(code) || string.IsNullOrWhiteSpace(state))
            return RedirectToAction("Index", "Home");

        // first validate the csrf token
        _fb = new FacebookClient();
        dynamic decodedState;
        try
        {
            decodedState = _fb.DeserializeJson(Encoding.UTF8.GetString(Convert.FromBase64String(state)), null);
            var exepectedCsrfToken = Session["fb_csrf_token"] as string;
            // make the fb_csrf_token invalid
            Session["fb_csrf_token"] = null;

            if (!(decodedState is IDictionary<string, object>) || !decodedState.ContainsKey("csrf") || string.IsNullOrWhiteSpace(exepectedCsrfToken) || exepectedCsrfToken != decodedState.csrf)
            {
                return RedirectToAction("Index", "Home");
            }
        }
        catch
        {
            // log exception
            return RedirectToAction("Index", "Home");
        }

        try
        {
            dynamic result = _fb.Post("oauth/access_token",
                                      new
                                      {
                                          client_id = AppId,
                                          client_secret = Appsecret,
                                          redirect_uri = RedirectUri,
                                          code = code
                                      });

            Session["fb_access_token"] = result.access_token;

            if (result.ContainsKey("expires"))
                Session["fb_expires_in"] = DateTime.Now.AddSeconds(result.expires);

            if (decodedState.ContainsKey("returnUrl"))
            {
                if (Url.IsLocalUrl(decodedState.returnUrl))
                    return Redirect(decodedState.returnUrl);
                return Redirect(decodedState.returnUrl + "/notlocal");
            }

            return RedirectToAction("Index", "Home");
        }
        catch
        {
            // log exception
            return RedirectToAction("Index", "Home");
        }
    }

Итак, насколько я понимаю, пользователь заходит на сайт (/ home / index), затем нажимает на ссылку для подключения (/ home / loggon), отвечает в Facebook (/ home / loginresult) и пользователь перенаправляется в / home / fbhome

Надеюсь, это помогло

Извините за мой английский!

...