2011-12-15 4 views
0

Интересно, мог ли кто-нибудь любезно указать мне в правильном направлении.FacebookWebContext.Current.IsAuthenticated() всегда возвращает false

Я использую facebook C# sdk для аутентификации пользователя. Я реализовал IFacebookApplication в своем global.asax, поэтому на более позднем этапе я могу программно предоставить AppId/AppSecret для разных приложений facebook.

Вот моя текущая настройка

У меня есть этот класс:

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

После того, как у меня есть перенаправление URL, Я отправляю пользователя на страницу авторизации, на странице обратного вызова у меня есть что-то вроде этого:

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, они всегда являются ложными и 0 соответственно. Похоже, что контекст не обновляется после аутентификации пользователя, и у меня есть access_token.

Мне нужно проверить, успешно ли аутентифицирован пользователь и получить его UserId и электронную почту позднее.

Если какая-либо помощь будет принята с благодарностью!

ответ

1

Ожидаемое поведение.

FacebookWebContext.Current.IsAuthorized проверяет либо facebook cookie, либо facebook signed_request, чтобы узнать, проверена ли она или нет. поскольку вы используете не используя javascript sdk или внутри приложения canvas, он всегда будет возвращать false.

Как только вы получите ExchangeCodeForAccessToken(), сохраните его где-нибудь, а затем используйте свой собственный логин. Затем используйте это, чтобы узнать, зарегистрирован ли пользователь или нет. (например, вы можете использовать FormsAuthentication с ним или даже сворачивать свой собственный auth.)

+0

AH! Теперь имеет смысл. Я сошел с ума! Спасибо. – user600314

+0

@prabir У меня такая же проблема. Если я использую только токен, то как я могу получить идентификатор пользователя facebook? – updev

+0

вам нужно сделать запрос на сервер facebook на «/ me», тогда вы можете получить идентификатор, используя result.id – prabir

Смежные вопросы