Facebook C#SDK版本6.0.20-(OAutheException-#190)验证访问令牌时出错

Facebook C#SDK版本6.0.20-(OAutheException-#190)验证访问令牌时出错,facebook,facebook-graph-api,facebook-c#-sdk,facebook-login,Facebook,Facebook Graph Api,Facebook C# Sdk,Facebook Login,我正在使用FacebookC#SDK版本6.0.20对用户进行身份验证 它对我来说效果很好,我能够得到用户的名字和姓氏。但是当我稍后尝试时,我正在获取访问令牌,但是fbClient.Get(“me”)失败,出现以下错误: (OAutheException–#190)验证访问令牌时出错:会话与当前存储的会话不匹配。这可能是因为用户在会话创建后更改了密码,或者Facebook出于安全原因更改了会话 请帮忙 当用户从“身份验证”对话框重定向回时,我运行以下代码: protected void Page

我正在使用FacebookC#SDK版本6.0.20对用户进行身份验证

它对我来说效果很好,我能够得到用户的名字和姓氏。但是当我稍后尝试时,我正在获取访问令牌,但是
fbClient.Get(“me”)
失败,出现以下错误:

(OAutheException–#190)验证访问令牌时出错:会话与当前存储的会话不匹配。这可能是因为用户在会话创建后更改了密码,或者Facebook出于安全原因更改了会话

请帮忙

当用户从“身份验证”对话框重定向回时,我运行以下代码:

protected void Page_Load(object sender, EventArgs e)
{
    if (Request.Params["code"] != null)
    {
      Facebook.FacebookClient fbClient = new Facebook.FacebookClient(GetAccessToken());

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

        string firstName = me.first_name;
        string lastName = me.last_name;
        string email = me.email;
        string userID = me.id;
        string gender = me.gender;
        string dob = me.birthday;
        string locale = me.locale;
        string mStatus = me.relationship_status;            
    }

}

private string GetAccessToken()
{
    if (HttpRuntime.Cache["access_token"] == null)
    {
        Dictionary<string, string> args = GetOauthTokens(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();
}

private Dictionary<string, string> GetOauthTokens(string code)
{
    Dictionary<string, string> tokens = new Dictionary<string, string>();

    string clientId = "xxxxxxxxxxxxxxxxxx";
    string redirectUrl = "http://localhost:51215/TestFBWebSite/FacebookRedirect.aspx";
    string clientSecret = "xxxxxxxxxxxxxxxxxxxxxx";

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

    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;
}
受保护的无效页面加载(对象发送方,事件参数e)
{
if(Request.Params[“code”!=null)
{
Facebook.Facebook客户端fbClient=新的Facebook.Facebook客户端(GetAccessToken());
动态me=fbClient.Get(“我”);
字符串firstName=me.first\u name;
字符串lastName=me.last\u name;
字符串email=me.email;
字符串userID=me.id;
字符串gender=me.gender;
字符串dob=me.birth;
字符串locale=me.locale;
字符串mStatus=me.relationship\u status;
}
}
私有字符串GetAccessToken()
{
if(HttpRuntime.Cache[“访问令牌”]==null)
{
Dictionary args=GetOauthTokens(Request.Params[“code”]);
HttpRuntime.Cache.Insert(“访问令牌”,args[“访问令牌”],null,DateTime.Now.AddMinutes(Convert.ToDouble(args[“expires”])),TimeSpan.Zero);
}
返回HttpRuntime.Cache[“访问令牌”].ToString();
}
专用字典GetOauthTokens(字符串代码)
{
字典标记=新字典();
字符串clientId=“xxxxxxxxxxxxxxxx”;
字符串重定向URL=”http://localhost:51215/TestFBWebSite/FacebookRedirect.aspx";
字符串clientSecret=“xxxxxxxxxxxxxxxxxxxxxx”;
字符串url=string.Format(“https://graph.facebook.com/oauth/access_token?  客户端\u id={0}&重定向\u uri={1}&客户端\u secret={2}&代码={3}“,
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));
}
}
归还代币;
}

我认为开头有语法错误

dynamic me = fbClient.Get("/me");

        string firstName = me.first_name;
        string lastName = me.last_name;
        string email = me.email;
        string userID = me.id;
        string gender = me.gender;
        string dob = me.birthday;
        string locale = me.locale;
        string mStatus = me.relationship_status; 
尝试使用此代码使用“\me”而不是“me”

string redirectUrl = "http://localhost:51215/TestFBWebSite/FacebookRedirect.aspx";
我注意到了这一部分-我发现在使用localhost(或127.0.0.1)时集成不起作用,我们通过为“test.mydomain.com”设置主机记录以指向127.0.0.1解决了这一问题

在我们的生活环境中,我们偶尔也会遇到#190错误。这很奇怪,因为生成错误的位置只有在Facebook刚刚对用户进行身份验证后才会被触发,所以身份验证令牌不应该已经过期! 我们正在编写代码来处理此错误(即,不在我们的系统上对用户进行身份验证),但到目前为止,我认为问题的原因有两种:

  • 在获得令牌后,我们给Facebook打电话太快了——如果Facebook将新的认证令牌传递给所有相关服务器时出现复制延迟,这可能是一种可能性
  • Facebook上的一般内部错误

  • 我认为这可能是选项1,但是我还没有找到足够的信息来备份它

    如果您向未知的人发送更多好友请求,您的帐户将被阻止并显示错误代码。因此,请取消请求并再次登录。

    当我将代码移动到实时环境中时,“\me”和“me”都可以正常工作。谢谢。我把我的代码移到了实时环境中,现在它似乎工作得很好。谢谢你的帮助。