0

ユーザーが Facebook 経由でログインできるようにする MVC 4 Web サイトを構築しています。これらはすべて、すぐに使える魅力のように機能します。

しかし今、私は Facebook からユーザーの誕生日を取得することに行き詰まっています。Nuget から最新バージョンの Facebook C# SDK (6.1.4) をインストールしました。user_birthday の許可を要求するように Facebook でアプリをセットアップしました。ログイン ダイアログのプレビューを見ると、誕生日が権限のリストに表示されています。

MVC アプリケーションを実行し、自分の Facebook アカウントを介してログインすると、応答で誕生日が返されますが、別のアカウントを使用してログインするとすぐに誕生日が返されず、ユーザーが許可できるログイン ダイアログもありません。誕生日フィールドを使用するアプリの許可。以下は、私の ExternalLoginCallback() アクションの完全なコードです。

[AllowAnonymous]
public ActionResult ExternalLoginCallback(string returnUrl)
{
    AuthenticationResult result = OAuthWebSecurity.VerifyAuthentication(Url.Action("ExternalLoginCallback", new { ReturnUrl = returnUrl }));

    if (!result.IsSuccessful)
    {
        return RedirectToAction("ExternalLoginFailure");
    }

    // Get the Facebook access token
    if (result.ExtraData.Keys.Contains("accesstoken"))
    {
        Session["facebooktoken"] = result.ExtraData["accesstoken"];
    }

    if (OAuthWebSecurity.Login(result.Provider, result.ProviderUserId, createPersistentCookie: false))
    {
        return RedirectToLocal(returnUrl);
    }

    if (User.Identity.IsAuthenticated)
    {
        // If the current user is logged in add the new account
        OAuthWebSecurity.CreateOrUpdateAccount(result.Provider, result.ProviderUserId, User.Identity.Name);

        return RedirectToLocal(returnUrl);
    }
    else
    {
        // User is new, ask for their desired membership name
        string loginData = OAuthWebSecurity.SerializeProviderUserId(result.Provider, result.ProviderUserId);

        ViewBag.ProviderDisplayName = OAuthWebSecurity.GetOAuthClientData(result.Provider).DisplayName;

        ViewBag.ReturnUrl = returnUrl;

        var client = new FacebookClient(Session["facebooktoken"].ToString());

        dynamic response = client.Get("me", new { fields = "gender, birthday" });

        return View("ExternalLoginConfirmation", 
            new RegisterExternalLoginModel 
            { 
                UserName = result.UserName, 
                FullName = result.ExtraData["name"], 
                DateOfBirth = DateTime.ParseExact(response["birthday"], "MM/dd/yyyy", CultureInfo.InvariantCulture), 
                ExternalLoginData = loginData 
            });
    }
}

ここで私が間違っていることを誰かが教えてくれることを願っています。私は 2 日間 Google で検索しましたが、どういうわけか正しい答えを見つけることができませんでした。それとも、私はそれを理解するのが愚かなだけなのかもしれません。

どんな助けでも大歓迎です。

エルウィン

4

2 に答える 2

1

スコープに誕生日を必ず追加する必要があります。デフォルトでは、facebookAuthenticationvar fbAuthOpt = new FacebookAuthenticationOptions(); によって把握されません。

        fbAuthOpt.Scope.Add("email");
        fbAuthOpt.Scope.Add("user_birthday");
        fbAuthOpt.AppId = "";
        fbAuthOpt.AppSecret = "";
        fbAuthOpt.SignInAsAuthenticationType = DefaultAuthenticationTypes.ExternalCookie;
        fbAuthOpt.Provider = new FacebookAuthenticationProvider
        {
            OnAuthenticated = async context =>
            {
                context.Identity.AddClaim(new System.Security.Claims.Claim("FacebookAccessToken", context.AccessToken));

                foreach (var claim in context.User)
                {
                    var claimType = string.Format("urn:facebook:{0}", claim.Key);
                    var claimValue = claim.Value.ToString();

                    if (!context.Identity.HasClaim(claimType, claimValue))
                        context.Identity.AddClaim(new System.Security.Claims.Claim(claimType, claimValue, "XmlSchemaString", "Facebook"));
                }

            }
        };

        app.UseFacebookAuthentication(fbAuthOpt);

後で、これを「urn:facebook:birthday」で把握します。

于 2014-02-28T13:00:26.757 に答える
0

この投稿には、私にとってうまくいった修正があります!彼はカスタム facebook プロバイダーを作成しました。そこで、アクセス許可を要求するスコープを作成してから、情報を取得するためのクエリ文字列を作成できます。

http://savvydev.com/authenticating-facebook-users-with-mvc-4-oauth-and-obtaining-scope-permissions/

于 2014-03-20T18:05:11.810 に答える