Aplicación web de Facebook permisos extendidos segundo paso no mostrar

Actualización2 Esta publicación está envejeciendo, pero sigue siendo relevante. A continuación se muestra cómo lo resolví. Marqué la respuesta de los otros chicos porque creo que responde mejor a la pregunta. Estoy llamando a un método similar (estoy a punto de refactorizar :)) en el controlador de cuenta. La cadena debe ser una lista ... Creo que lo entiendes.

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

Luego, cada método que realiza una llamada a Facebook como / me / home con facebok C # SDK detecta FacebookOAuthException y redirige al método de seguimiento. Así es como aplicamos la mejor práctica de no solicitar permisos a los usuarios por adelantado, sino cuando sea necesario. Este método también debería tener una URL uredirecta que coincida, pero nos hemos puesto en marcha :)

¡Espero eso ayude!

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

Actualizar: Este comportamiento se debe a la implementación de .Net oauth que tiene el alcance codificado en una clase sellada. Se agregó la figura 4 para mostrar el parámetro de solicitud donde se encuentra la falta de ámbitos adicionales además del "correo electrónico" (que se envía con todas las solicitudes del proveedor de .net oauth). Agregar ", publish_stream" a la cadena de consulta me da el comportamiento deseado. ¿Alguien sabe como lograr esto?

No envíe respuestas ni comentarios sobre las mejores prácticas de Facebook o soluciones alternativas. Tengo una solución alternativa, pero me gustaría que esto funcionara con los parámetros de cliente predeterminados de registro de libro. He actualizado la aplicación para utilizar únicamente publish_stream de acuerdo con las dos respuestas que especifican los permisos que solicito.

Figura 4

Pregunta original: Estoy configurando una aplicación (C # .Net4.5 MVC4, vistas geniales) que necesita prácticamente todos los permisos de usuario disponibles en Facebook. Puedes ver ejemplos de código debajo de cómo lo he configurado todo.

El problema es que al hacer clic en "Aceptar" en la figura 1, Facebook me envía a mi aplicación. Según tengo entendido, debería haber una pantalla adicional (figura 2) que solicite los permisos "más pesados". A partir de ahora solo obtengo los permisos indicados en la figura uno. Esa parte funciona ...

Figura 1

Figura 2

Entonces, usando AuthConfig.cs básico

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

Así es como manejo la respuesta, pero aquí Facebook no ha solicitado al usuario los permisos extendidos, sino solo el correo electrónico.

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

Lo más cercano a una respuesta que pude encontrar fue un plugin wp que tenía el mismo problema. Su problema se resolvió estableciendo el dominio a localhost. Así es como se configura mi aplicación. [ingrese la descripción de la imagen aquí] [4]

Respuestas a la pregunta(3)

Su respuesta a la pregunta