Rozszerzone uprawnienia aplikacji internetowej Facebook drugiego kroku nie pokazuj

Aktualizacja2 Ten post się starzeje, ale wciąż jest ważny. Poniżej znajduje się sposób, w jaki go rozwiązałem. Zaznaczyłem odpowiedź pozostałych facetów, ponieważ myślę, że lepiej odpowiada na pytanie. Nazywam podobną metodę (I'am o refactor :)) w accountcontroller. Ciąg powinien być listą ... Myślę, że to rozumiesz.

/// <summary>
    /// Use this method when an action fails due to lack of priviligies. It will redirect user to facebook with provided permission request.
    /// Refactor to handle list of request.
    /// </summary>
    /// <param name="permission"></param>
    private static void AddAdditionalPermissions(string permission)
    {
        System.Diagnostics.Trace.TraceInformation(permission + " not authorized for user.");
        string facebook_urlAuthorize_base = "https://graph.facebook.com/oauth/authorize";
        string scope = permission; //see: https://developers.facebook.com/docs/authentication/permissions/ for extended permissions
        string urlAuthorize = facebook_urlAuthorize_base;
        urlAuthorize += "?client_id=" + AppId;
        urlAuthorize += "&redirect_uri=" + "https://fbd.anteckna.nu/";
        urlAuthorize += "&scope=" + scope;

        //redirect the users browser to Facebook to ask the user to authorize our Facebook application
        HttpContext.Current.Response.Redirect(urlAuthorize, true); //this cannot be done using WebRequest since facebook may need to show dialogs in the users browser
    }

Następnie każda metoda nawiązywania połączenia z Facebookiem jak / me / home z facebokiem C # SDK przechwytuje FacebookOAuthException i przekierowuje do metody folling. W ten sposób stosujemy najlepszą praktykę polegającą na tym, aby nie pytać użytkowników o uprawnienia, ale w razie potrzeby. Ta metoda powinna mieć bezpośredni adres URL, który również pasuje, ale właśnie zaczęliśmy :)

Mam nadzieję, że to pomoże!

/// <summary>
    /// Check for what permissions to request or different ways to handle FacebookOAuthExceptions.
    /// </summary>
    /// <param name="foae">The exception object</param>
    public static void HandleAuthorizationsExceptions(FacebookOAuthException foae)
    {
        if (foae.Message.Contains("publish_permissions"))
        {
            AddAdditionalPermissions("publish_permissions");
        }
        else if (foae.Message.Contains("read_stream"))
        {
            AddAdditionalPermissions("read_stream");
        }
        else
        {
            System.Diagnostics.Trace.TraceError("Unhandled error at:" + foae.StackTrace);
        }
    }

Aktualizacja: To zachowanie jest spowodowane implementacją .Net oauth, która ma zakodowany zakres w klasie zamkniętej. Dodano rysunek 4, aby pokazać parametr żądania, w którym brak dodatkowych zakresów oprócz „e-maila” (który jest wysyłany ze wszystkimi żądaniami dostawcy .net oauth). Dodanie „, publication_stream” do ciągu zapytania daje mi pożądane zachowanie. Ktoś wie, jak to osiągnąć?

Nie przesyłaj odpowiedzi ani komentarzy na temat najlepszych praktyk lub alternatywnych rozwiązań na Facebooku. Mam alternatywne rozwiązanie, ale chciałbym, aby działało ono z domyślnymi parametrami registerfacebookclient. Zaktualizowałem aplikację do oly, która używa opublikowania strumienia, zgodnie z dwiema odpowiedziami określającymi, o jakie uprawnienia pytam.

rysunek 4

Oryginalne pytanie: Konfiguruję aplikację (C # .Net4.5 MVC4, widoki maszynki do golenia), która wymaga prawie wszystkich dostępnych uprawnień użytkowników z Facebooka. Możesz zobaczyć przykłady kodu poniżej, jak to wszystko skonfigurowałem.

Problem polega na tym, że po kliknięciu „OK” na rysunku 1 Facebook wysyła mnie z powrotem do mojej aplikacji. Jak rozumiem powinien istnieć dodatkowy ekran (rysunek 2) z prośbą o „cięższe” uprawnienia. Obecnie otrzymuję tylko uprawnienia wymienione na rysunku pierwszym. Ta część działa ...

Rysunek 1

Rysunek 2

Tak więc, używając podstawowego AuthConfig.cs

var facebooksocialData = new Dictionary<string, object>();
            facebooksocialData.Add("scope", "email,publish_stream,read_stream,publish_actions,manage_pages,create_event,offline_access");
            OAuthWebSecurity.RegisterFacebookClient(
                appId: "165359673639901",
                appSecret: "15091cb2094a1996ae6c7b324f0300e6",
                displayName: "Facebook",
                extraData: facebooksocialData);

Tak radzę sobie z odpowiedzią, ale tutaj facebook nie monitował użytkownika o rozszerzone uprawnienia, ale tylko o e-mail,

AccountController.cs

 //
        // GET: /Account/ExternalLoginCallback

        [AllowAnonymous]
        public ActionResult ExternalLoginCallback(string returnUrl)
        {
            AuthenticationResult result = OAuthWebSecurity.VerifyAuthentication(Url.Action("ExternalLoginCallback", new { ReturnUrl = returnUrl }));
            if (!result.IsSuccessful)
            {
                return RedirectToAction("ExternalLoginFailure");
            }

            // Save the accesstoken into session
            Session["accesstoken"] = result.ExtraData["accesstoken"];
            Session["id"] = result.ExtraData["id"];

            if (OAuthWebSecurity.Login(result.Provider, result.ProviderUserId, createPersistentCookie: false))
            {
                return RedirectToLocal(returnUrl);
            }

            if (User.Identity.IsAuthenticated)
            {
                // If the current user is logged in add the new account
                OAuthWebSecurity.CreateOrUpdateAccount(result.Provider, result.ProviderUserId, User.Identity.Name);
                return RedirectToLocal(returnUrl);
            }
            else
            {
                // User is new, ask for their desired membership name
                string loginData = OAuthWebSecurity.SerializeProviderUserId(result.Provider, result.ProviderUserId);
                ViewBag.ProviderDisplayName = OAuthWebSecurity.GetOAuthClientData(result.Provider).DisplayName;
                ViewBag.ReturnUrl = returnUrl;
                return View("ExternalLoginConfirmation", new RegisterExternalLoginModel { UserName = result.UserName, ExternalLoginData = loginData });
            }
        }

Najbliższą odpowiedzią, jaką mogłem znaleźć, była wtyczka wp, która miała ten sam problem. Ich problem został rozwiązany przez ustawienie domeny na localhost. Tak jest skonfigurowana moja aplikacja. ! [wprowadź opis obrazu tutaj] [4]

questionAnswers(3)

yourAnswerToTheQuestion