Ich habe eine localhost-Website, auf der ich mich über Facebook mit Facebook C# SDK angemeldet habe.getLoginStatus gibt den Status unbekannt zurück, wenn versucht wird, sich über Facebook mit JS SDK zu melden.
Startkonfiguration Klasse:
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);
}
}
Aktionen bilden Authentifikationssteuervorrichtung:
[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);
}
Book JS SDK Initialisierung:
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'));
Ich bin versucht, einen Benutzer aus Facebook mit dem Facebook JS SDK anmelden, aber Aufruf:
FB.getLoginStatus(function facebookLogoutCallback(facebookResponse) {
if (facebookResponse.status !== 'connected') {
return;
}
FB.logout(facebookLogoutCallback);
});
führt zu Status unknown
statt connected
, die in facebookResponse
Objekt zurückgegeben wird. Ich habe auch versucht, FB.logout()
ohne if
Anweisung zu nennen, aber es hat nicht funktioniert.
Vielleicht können Sie sagen, dass dieses Verhalten von einem nicht autorisierten Benutzerstatus verursacht wird, aber nach der serverseitigen Anmeldung ist der Benutzer tatsächlich angemeldet: auf meiner Website und Facebook auch.
was ist die wirkliche Lösung dafür? – manonthemoon