I have a localhost site where I implemented Facebook login using the Facebook C # SDK.
Startup Configuration Class :
public class ExternalLoginConfig { public void ConfigureAuth(IAppBuilder app) { app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); var facebookAuthenticationOptions = new FacebookAuthenticationOptions() { AppId = ConfigSettings.FacebookAppId, AppSecret = ConfigSettings.FacebookAppSecret, Scope = { "email" }, Provider = new FacebookAuthenticationProvider() { OnAuthenticated = context => { var accessToken = context.AccessToken; var facebookClient = new FacebookClient(accessToken); var result = facebookClient.Get("me", new { fields = "email,first_name,last_name" }) as JsonObject; string email = null; string firstName = null; string lastName = null; if (result != null) { email = result.ContainsKey("email") ? (string) result["email"] : null; firstName = result.ContainsKey("first_name") ? (string) result["first_name"] : null; lastName = result.ContainsKey("last_name") ? (string) result["last_name"] : null; } if (firstName != null) { context.Identity.AddClaim(new Claim(ClaimTypes.GivenName, firstName)); } if (lastName != null) { context.Identity.AddClaim(new Claim(ClaimTypes.Surname, lastName)); } if (email != null) { context.Identity.AddClaim(new Claim(ClaimTypes.Email, email)); } return Task.FromResult(0); }, OnApplyRedirect = context => { context.Response.Redirect(context.RedirectUri + "&auth_type=reauthenticate"); } } }; app.UseFacebookAuthentication(facebookAuthenticationOptions); } }
Authentication controller action form :
[HttpPost] [AllowAnonymous] public virtual ActionResult Login(string provider, string returnUrl) { ControllerContext.HttpContext.Session.RemoveAll(); return new ExternalLoginResult(provider, Url.Action("LoginCallback", "Oauth", new { ReturnUrl = returnUrl })); } [AllowAnonymous] public async Task<ActionResult> LoginCallback(string returnUrl, string error) { var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); if (loginInfo == null) { return Redirect(returnUrl); } User user = null; string userName = Guid.NewGuid().ToString(); string firstName = loginInfo.ExternalIdentity.FindFirstValue(ClaimTypes.GivenName); string lastName = loginInfo.ExternalIdentity.FindFirstValue(ClaimTypes.Surname); string email = loginInfo.ExternalIdentity.FindFirstValue(ClaimTypes.Email); string externalProviderName = loginInfo.Login.LoginProvider; string externalProviderKey = loginInfo.Login.ProviderKey; var externalAuthenticationInfo = new ExternalAuthenticationInfo() { Username = userName, Email = email, FirstName = firstName, LastName = lastName, ExternalProviderName = externalProviderName, ExternalProviderKey = externalProviderKey }; var loginResult = userProvider.ExternalLogin(externalProviderKey, email, out user); switch (loginResult) { case LoginResult.Success: { AuthenticationHelper.SetAuthenticatedUserId(user.ID); break; } case LoginResult.NotRegistered: { var registerResult = userProvider.Register(userName, email, null, externalAuthenticationInfo); if (registerResult.IsValid) { AuthenticationHelper.SetAuthenticatedUserId(registerResult.Result.ID); } break; } } return Redirect(returnUrl); }
Initializing the Facebook JS SDK :
window.fbAsyncInit = function () { FB.init({ appId: '@ConfigSettings.FacebookAppId', xfbml: true, version: 'v2.4' }); }; (function (d, s, id) { var js, fjs = d.getElementsByTagName(s)[0]; if (d.getElementById(id)) { return; } js = d.createElement(s); js.id = id; js.src = "//connect.facebook.net/en_US/sdk.js"; fjs.parentNode.insertBefore(js, fjs); }(document, 'script', 'facebook-jssdk'));
I am trying to pull a user out of Facebook using the Facebook JS SDK, but calling:
FB.getLoginStatus(function facebookLogoutCallback(facebookResponse) { if (facebookResponse.status !== 'connected') { return; } FB.logout(facebookLogoutCallback); });
results in unknown status instead of connected , which is returned in the facebookResponse object. I also tried calling FB.logout() without an if , but that didn't work.
Perhaps you can say that this behavior is caused by the unauthorized status of the user, but after logging in to the server account, the user actually registered on my site and on Facebook, too.