FacebookWebContext.Current.IsAuthenticated()始终返回false

时间:2011-12-15 17:52:01

标签: facebook facebook-c#-sdk

我想知道是否有人能指出我正确的方向。

我正在使用facebook c#sdk来验证用户身份。我已经在我的global.asax中实现了IFacebookApplication,所以在以后我可以以编程方式为不同的facebook应用程序提供AppId / AppSecret。

这是我当前的设置

我有这堂课:

public class RequestScopedFacebookApplication : IFacebookApplication
{
public RequestScopedFacebookApplication() 
{

}

public IFacebookApplication Current
{
    get
    {
        var url = HttpContext.Current.Request.Url;
        var app = new DefaultFacebookApplication();
        app.AppId = "xxx";
        app.AppSecret = "xxx";
        return app;
    }
}

public string AppId
{
    get { return Current.AppId; }
}


public string AppSecret
{
    get { return Current.AppSecret; }
}

public string CancelUrlPath
{
    get { return Current.CancelUrlPath; }
}

public string CanvasPage
{
    get { return Current.CanvasPage; }
}

public string CanvasUrl
{
    get { throw new NotImplementedException(); }
}

public string SecureCanvasUrl
{
    get { throw new NotImplementedException(); }
}

public string SiteUrl
{
    get { throw new NotImplementedException(); }
}

public bool UseFacebookBeta
{
    get { return Current.UseFacebookBeta; }
}

}

在我的global.asax中:

void Application_Start(object sender, EventArgs e) 
{
    // Code that runs on application startup
    Facebook.FacebookApplication.SetApplication(new RequestScopedFacebookApplication());
}

获得重定向网址后,我将用户发送到授权页面,在回调页面上,我有这样的内容:

if (Request.QueryString["code"] != null)
        {

            FacebookOAuthResult result;
            if (FacebookOAuthResult.TryParse(Request.Url, out result))
            {
                if (result.IsSuccess)
                {
                    var code = result.Code;

                    var oauthClient = new FacebookOAuthClient(FacebookWebContext.Current.Settings);
                    oauthClient.RedirectUri = new Uri("...");

                    dynamic parameters = new ExpandoObject();
                    parameters.redirect_uri = "...";
                    dynamic tokenResult = oauthClient.ExchangeCodeForAccessToken(code, parameters);

                    var accessToken = tokenResult.access_token;
                    var bum = new FacebookClient(accessToken);


                }
                else
                {
                    var errorDescription = result.ErrorDescription;
                    var errorReason = result.ErrorReason;
                }
            }

        }

所以现在我有了令牌。如果我这样做:

bum.get("/me/feed")

这很好用,我得到了一些我的数据。

我遇到的问题是,当我尝试从FacebookWebContext.Current.IsAuthenticated()或FacebookWebContext.Current.UserId访问某些内容时,它们总是分别为false和0。一旦用户通过身份验证并且我有access_token,就看起来Context不会更新。

我需要能够检查用户是否已成功通过身份验证,并在以后获取其UserId和电子邮件。

如果有任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

这是预期的行为。

FacebookWebContext.Current.IsAuthorized检查facebook cookie或facebook signed_request以了解它是否经过身份验证。由于您使用的不使用javascript sdk或在canvas应用程序中,它将始终返回false。

获得ExchangeCodeForAccessToken()后,将其安全地存储在某处,然后使用您自己的自定义登录。然后使用它来了解用户是否已登录。 (例如,您可能希望使用FormsAuthentication或甚至汇总您的自定义身份验证。)