ASP.NET MVC 5.1 C#OWIN facebook身份验证或登录请求生日,喜欢,公开个人资料,电话号码

Md.*_*rim 10 c# asp.net-mvc facebook-login owin asp.net-mvc-5.2

我看过很多关于facebook身份验证的帖子,要么是旧的,要么是不正常的.

然而,最后我在我的项目中做了一些有效但不完全的东西.这是我要求的代码

        var facebookAuthenticationOptions = new FacebookAuthenticationOptions()
        {
            AppId = "...ID",
            AppSecret = "...AppSecret",
            AuthenticationType = "Facebook",
            SignInAsAuthenticationType = "ExternalCookie",
            //Provider = new FacebookAuthenticationProvider
            //{
            //    OnAuthenticated = async ctx =>
            //    {
            //        if (ctx.User["birthday"] != null)
            //        {
            //            ctx.Identity.AddClaim(new Claim(ClaimTypes.DateOfBirth,ctx.User["birthday"].ToString()));
            //        }
            //    }
            //}
        };
        facebookAuthenticationOptions.Scope.Add("user_birthday");
        //facebookAuthenticationOptions.Scope.Add("first_name");
        //facebookAuthenticationOptions.Scope.Add("last_name");
        //page goes blank if ask for first_name,last_name , if comment out works
        //but doesn give date of birth or likes or other things.
        facebookAuthenticationOptions.Scope.Add("publish_stream");
        facebookAuthenticationOptions.Scope.Add("user_likes");
        facebookAuthenticationOptions.Scope.Add("friends_likes");
        facebookAuthenticationOptions.Scope.Add("read_stream");
        facebookAuthenticationOptions.Scope.Add("email");

        app.UseFacebookAuthentication(facebookAuthenticationOptions);
Run Code Online (Sandbox Code Playgroud)

我从返回结果得到什么.

任何人都可以请帮助我为什么我没有得到朋友,生日,user_likes等.

另外,如何获取这些字符串值(即"user_birthday","first_name")进行信息检索,比如我怎么知道"user_birthday"返回生日的日期(我是从搜索中得到的),是否有任何列表有这个字符串名称(即"user_birthday","first_name")?

如果我使用谷歌身份验证,是否可以获得电话号码或名字,姓氏?

Md.*_*rim 11

解决了它,参考文献:https://developers.facebook.com/docs/facebook-login/permissions/v2.1#reference

            var facebookAuthenticationOptions = new FacebookAuthenticationOptions() {
            AppId = ".....",
            AppSecret = ".....",
            AuthenticationType = "Facebook",
            SignInAsAuthenticationType = "ExternalCookie",
            Provider = new FacebookAuthenticationProvider {
                OnAuthenticated = async ctx => {
                    ctx.Identity.AddClaim(new Claim(ClaimTypes.DateOfBirth, ctx.User["birthday"].ToString()));
                    ctx.Identity.AddClaim(new Claim(ClaimTypes.Country, ctx.User["birthday"].ToString()));
                    ctx.Identity.AddClaim(new Claim(ClaimTypes.Gender, ctx.User["birthday"].ToString()));
                    ctx.Identity.AddClaim(new Claim(ClaimTypes.MobilePhone, ctx.User["birthday"].ToString()));
                    ctx.Identity.AddClaim(new Claim(ClaimTypes.OtherPhone, ctx.User["birthday"].ToString()));
                    ctx.Identity.AddClaim(new Claim(ClaimTypes.HomePhone, ctx.User["birthday"].ToString()));
                    ctx.Identity.AddClaim(new Claim(ClaimTypes.StateOrProvince, ctx.User["birthday"].ToString()));
                    ctx.Identity.AddClaim(new Claim(ClaimTypes.Email, ctx.User["birthday"].ToString()));
                    ctx.Identity.AddClaim(new Claim(ClaimTypes.Country, ctx.User["birthday"].ToString()));
                    ctx.Identity.AddClaim(new Claim(ClaimTypes.Actor, ctx.User["birthday"].ToString()));
                    ctx.Identity.AddClaim(new Claim(ClaimTypes.DateOfBirth, ctx.User["birthday"].ToString()));
                }
            }
        };
        facebookAuthenticationOptions.Scope.Add("user_birthday");
        //facebookAuthenticationOptions.Scope.Add("first_name");
        //facebookAuthenticationOptions.Scope.Add("last_name");
        facebookAuthenticationOptions.Scope.Add("publish_stream");
        facebookAuthenticationOptions.Scope.Add("user_likes");
        facebookAuthenticationOptions.Scope.Add("friends_likes");
        facebookAuthenticationOptions.Scope.Add("user_about_me");
        facebookAuthenticationOptions.Scope.Add("user_friends");
        facebookAuthenticationOptions.Scope.Add("user_actions.news");
        facebookAuthenticationOptions.Scope.Add("user_actions.video");
        facebookAuthenticationOptions.Scope.Add("user_education_history");
        facebookAuthenticationOptions.Scope.Add("manage_pages");
        facebookAuthenticationOptions.Scope.Add("user_interests");
        facebookAuthenticationOptions.Scope.Add("user_location");
        facebookAuthenticationOptions.Scope.Add("user_photos");
        facebookAuthenticationOptions.Scope.Add("user_relationships");
        facebookAuthenticationOptions.Scope.Add("user_relationship_details");
        facebookAuthenticationOptions.Scope.Add("user_status");
        facebookAuthenticationOptions.Scope.Add("user_tagged_places");
        facebookAuthenticationOptions.Scope.Add("user_videos");
        facebookAuthenticationOptions.Scope.Add("user_website");
        facebookAuthenticationOptions.Scope.Add("read_friendlists");
        facebookAuthenticationOptions.Scope.Add("read_stream");
        facebookAuthenticationOptions.Scope.Add("email");
        app.UseFacebookAuthentication(facebookAuthenticationOptions);
Run Code Online (Sandbox Code Playgroud)

ctx获得了所有信息..只需要经历它.

仍然没有关于如何获得谷歌的第一个,姓氏和电话号码+出生日期的信息.或者如何从Gmail帐户访问用户联系人.


Moh*_*zza 7

您可以循环上下文.用户获取所有声明

  var facebookAuthOptions = new FacebookAuthenticationOptions();
        facebookAuthOptions.AppId = "..."; //Enter your AppId
        facebookAuthOptions.AppSecret = "..."; //Enter your AppSecret
 facebookAuthOptions.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);
                    string claimValue = claim.Value.ToString();
                    if (!context.Identity.HasClaim(claimType, claimValue))
                        context.Identity.AddClaim(new System.Security.Claims.Claim(claimType, claimValue, "XmlSchemaString", "Facebook"));
                }
            }
    };
Run Code Online (Sandbox Code Playgroud)

谷歌也是如此

 var googleAuthOptions = new GoogleOAuth2AuthenticationOptions();
        googleAuthOptions.ClientId = "..."; //Enter your ClientId 
        googleAuthOptions.ClientSecret = "..."; //Enter your ClientSecret
googleAuthOptions.Provider = new GoogleOAuth2AuthenticationProvider()
    {
        OnAuthenticated = async context =>
        {
            context.Identity.AddClaim(new System.Security.Claims.Claim("GoogleAccessToken", context.AccessToken));
            foreach (var claim in context.User)
            {
                var claimType = string.Format("urn:google:{0}", claim.Key);
                string claimValue = claim.Value.ToString();
                if (!context.Identity.HasClaim(claimType, claimValue))
                    context.Identity.AddClaim(new System.Security.Claims.Claim(claimType, claimValue, "XmlSchemaString", "Google"));
            }
        }
    };
Run Code Online (Sandbox Code Playgroud)

我认为用户的隐私设置和您的应用程序权限控制着您可以获得的声明.