Facebook c# sdk Facebook c#sdk始终使用同一帐户登录

Facebook c# sdk Facebook c#sdk始终使用同一帐户登录,facebook-c#-sdk,Facebook C# Sdk,我将此方法与Facebook C#SDK(6.0.10.0)一起使用,以获得授权并检索访问Facebook的令牌:- public static void FacebookLogon() { string clientId = "xxxxxxxxxxxxxxxxx"; string redirectUrl = Biz.BizFolders.ExpandUrl("CallbackHandlers/FacebookCallba

我将此方法与Facebook C#SDK(6.0.10.0)一起使用,以获得授权并检索访问Facebook的令牌:-

public static void FacebookLogon()
            {
            string clientId = "xxxxxxxxxxxxxxxxx";

            string redirectUrl = Biz.BizFolders.ExpandUrl("CallbackHandlers/FacebookCallback.ashx"); 

            string logonScope = "email,user_checkins,publish_stream,read_stream";

            string url = string.Format("https://graph.facebook.com/oauth/authorize?client_id={0}&redirect_uri={1}&scope={2}" 
                           , clientId , redirectUrl , logonScope);

            HttpContext.Current.Response.Redirect(url);
            }
按预期工作的回调是一个通用处理程序,如下所示:-

public class FacebookCallback : IHttpHandler , System.Web.SessionState.IRequiresSessionState

    {

    public void ProcessRequest(HttpContext context)
        {
        string newUrl = "";

        if (context.Request.Params["code"] != null)
            {
            // Accepted...

            string accessCode = GetFacebookAccessToken();
            FacebookClient api = new FacebookClient(accessCode);

            dynamic me = api.Get("me");

            if (me != null)
                {
                string id = me.id;
                LoadOrCreateUser(...);
                }

            }
        else
            {
            // Declined ....
            }

        }

    }
}
获取facebook访问令牌功能也可以按预期工作

  public static string GetFacebookAccessToken()

        {

        if(String.IsNullOrEmpty((string)HttpRuntime.Cache["access_token"]) == true)
        {

            Dictionary<string, string> args = GetFacebookOauthTokens(HttpContext.Current.Request.Params["code"]);
            HttpRuntime.Cache.Insert("access_token" , args["access_token"] , null , DateTime.Now.AddMinutes(Convert.ToDouble(args["expires"])) , TimeSpan.Zero);
        }

    return HttpRuntime.Cache["access_token"].ToString();

    }
公共静态字符串GetFacebookAccessToken()
{
if(String.IsNullOrEmpty((String)HttpRuntime.Cache[“访问令牌])==true)
{
Dictionary args=GetFacebookOauthTokens(HttpContext.Current.Request.Params[“code]”);
HttpRuntime.Cache.Insert(“访问令牌”,args[“访问令牌”],null,DateTime.Now.AddMinutes(Convert.ToDouble(args[“expires”])),TimeSpan.Zero);
}
返回HttpRuntime.Cache[“访问令牌”].ToString();
}
最后,该函数还可以检索访问令牌:-

public static Dictionary<string , string> GetFacebookOauthTokens(string code)
        {
    Dictionary<string , string> tokens = new Dictionary<string , string>();

    string clientId = "xxxxxxxx";
    string clientSecret = "yyyyyyyyyy";

    string redirectUrl = Biz.BizFolders.ExpandUrl("CallbackHandlers/FacebookCallback.ashx");

    string scope = "read_friendlists,user_status";

    string url = string.Format("https://graph.facebook.com/oauth/access_token?client_id={0}&redirect_uri={1}&client_secret={2}&code={3}&scope={4}" ,
                    clientId , redirectUrl , clientSecret , code , scope);

    HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;

    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
        {

        StreamReader reader = new StreamReader(response.GetResponseStream());

        string retVal = reader.ReadToEnd();

        foreach (string token in retVal.Split('&'))
            {
            tokens.Add(token.Substring(0 , token.IndexOf("=")) ,
                token.Substring(token.IndexOf("=") + 1 , token.Length - token.IndexOf("=") - 1));
            }
        }

    return tokens;
    }
公共静态字典GetFacebookOauthTokens(字符串代码)
{
字典标记=新字典();
字符串clientId=“xxxxxxxx”;
字符串clientSecret=“yyyyyyyyyy”;
string redirectUrl=Biz.BizFolders.ExpandUrl(“CallbackHandlers/FacebookCallback.ashx”);
string scope=“读取好友列表,用户状态”;
字符串url=string.Format(“https://graph.facebook.com/oauth/access_token?client_id={0}&redirect_uri={1}&client_secret={2}&code={3}&scope={4}”,
clientId、重定向URL、clientSecret、代码、范围);
HttpWebRequest-request=WebRequest.Create(url)为HttpWebRequest;
使用(HttpWebResponse=request.GetResponse()作为HttpWebResponse)
{
StreamReader=新的StreamReader(response.GetResponseStream());
string retVal=reader.ReadToEnd();
foreach(retVal.Split('&')中的字符串标记)
{
tokens.Add(token.Substring(0,token.IndexOf(“=”)),
子字符串(token.IndexOf(“=”)+1,token.Length-token.IndexOf(“=”-1));
}
}
归还代币;
}
所有这些都非常有效。但不幸的是,我遇到了三个问题:-

  • 我从未被提示登录facebook。我的应用程序总是日志的 无论我是否登录facebook,我都会与同一用户保持联系

  • me=api.Get(“me”)'始终返回同一个人。我不知道它是从哪里得到这些信息的

  • 当我使用“me/feed”阅读新闻提要时,我只收到消息
    是我贴的,没有其他人


我的应用程序目前在facebook中注册为沙盒应用程序。我试着改变这个模式,但没什么不同。我也尝试过添加开发人员和测试人员,但也没有什么乐趣。如果有人知道为什么会发生这种情况,那将对我很有帮助。

我无法确定你的应用程序的正确流程。但我很确定您面临的问题是由于访问令牌造成的。
通过服务器端生成的访问令牌有效期为2个月。这意味着您可以使用它代表用户执行图形api调用,直到令牌过期。这就是为什么当您调用
me=api.Get(“me”)时,它会返回同一个人的详细信息
这里有一个很好的解释

对于上一个问题,
me/feed
返回用户的时间线帖子。要获取用户的新闻提要,您需要调用
me/home