Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用ASP.NET Web API 2.0和Identity在外部登录/注册期间从Facebook检索其他配置文件信息_C#_Asp.net_Facebook_Asp.net Web Api_Asp.net Identity - Fatal编程技术网

C# 使用ASP.NET Web API 2.0和Identity在外部登录/注册期间从Facebook检索其他配置文件信息

C# 使用ASP.NET Web API 2.0和Identity在外部登录/注册期间从Facebook检索其他配置文件信息,c#,asp.net,facebook,asp.net-web-api,asp.net-identity,C#,Asp.net,Facebook,Asp.net Web Api,Asp.net Identity,关于如何使用ASP.NET身份和MVC客户端从Facebook个人资料中获取附加信息,似乎有很多文档,但我似乎找不到任何关于如何从Web API控制器访问附加信息声明的文档 我的Startup.Auth.cs ConfigAuth方法包含这一点,如果我在JObject wholeUser=context.User上设置断点,它似乎可以正常工作 String XmlSchemaString = "http://schemas.xmlsoap.org/ws/2005/05/identity/clai

关于如何使用ASP.NET身份和MVC客户端从Facebook个人资料中获取附加信息,似乎有很多文档,但我似乎找不到任何关于如何从Web API控制器访问附加信息声明的文档

我的Startup.Auth.cs ConfigAuth方法包含这一点,如果我在JObject wholeUser=context.User上设置断点,它似乎可以正常工作

String XmlSchemaString = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims";
var facebookOptions = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationOptions()
{
    AppId = "*",
    AppSecret = "*",
    Provider = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationProvider()
    {
        OnAuthenticated = (context) =>
        {
            JObject wholeUser = context.User;

            context.Identity.AddClaim(new System.Security.Claims.Claim("urn:facebook:access_token", context.AccessToken, XmlSchemaString, "Facebook"));
            context.Identity.AddClaim(new System.Security.Claims.Claim("urn:facebook:email", context.Email, XmlSchemaString, "Facebook"));
            return Task.FromResult(0);
        }
    }
};
facebookOptions.Scope.Add("email");
app.UseFacebookAuthentication(facebookOptions);
一旦认证,wholeUser将拥有我需要的所有信息,如生日等。但一旦超出此范围,我不知道如何访问它

我需要在AccountController.RegisterExternal中获取此信息,但我似乎无法正确配置它。很多MVC doco都在ExternalLoginCallback方法中使用了这一点:

ClaimsIdentity claimsIdentity = await AuthenticationManager.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);
但是在Web API中找不到AuthenticationManager,因此如果我将其更改为仅验证,它将返回null,除非我将参数更改为DefaultAuthenticationTypes.ExternalBearner。这是我得到的最接近的结果,但是返回的ClaimSideEntity对象没有任何附加声明-只有用户名和ID


所以总的来说,我好像是从Facebook上正确地获取信息,然后塞进context.Identity中,但是我不知道如何从控制器访问它。注意:ConfigAuth中的上下文对象的类型为Microsoft.Owin.Security.Facebook.FacebookAuthenticatedContext

我不确定您是否需要与我相同的内容,但请查看


有一个小样本项目,它进行Facebook身份验证,检索访问令牌,并使用我在NuGet中找到的一些.NET SDK进行调用。我在这里使用了以下代码:

            var facebookOptions = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationOptions
        {
            AppId = "*",
            AppSecret = "**",
            Provider = new FacebookAuthenticationProvider()
            {
                OnAuthenticated = (context) =>
                {
                    context.Identity.AddClaim(new System.Security.Claims.Claim("urn:facebook:access_token", context.AccessToken, ClaimValueTypes.String, "Facebook"));

                    return Task.FromResult(0);
                }
            },
        };
        facebookOptions.Scope.Add("email");
        app.UseFacebookAuthentication(facebookOptions);
现在在RegisterExternal方法中,我可以使用该声明。我只是不知道如何将它保存在标识中,以便可以在其他控制器调用中使用它。如果我将声明添加到标识中,那么它似乎会破坏其他调用中的User.identity对象

ExternalLoginData externalLogin = ExternalLoginData.FromIdentity(User.Identity as ClaimsIdentity);
和FromIdentity方法

            public static ExternalLoginData FromIdentity(ClaimsIdentity identity)
        {
            if (identity == null)
            {
                return null;
            }
            string userEmail = string.Empty;
            string userFacebookAccessToken = string.Empty;

            Claim providerKeyClaim = identity.FindFirst(ClaimTypes.NameIdentifier);
            Claim facebookToken = identity.Claims.First(x => x.Type.Contains("access_token"));
            Claim emailDetails = identity.FindFirst(ClaimTypes.Email);

            if (facebookToken != null) userFacebookAccessToken = facebookToken.Value;
            if (emailDetails != null)  userEmail = emailDetails.Value;
            //string userEmail = identity.Claims.First(x => x.Type.Contains("emailaddress")).Value;

            if (providerKeyClaim == null || String.IsNullOrEmpty(providerKeyClaim.Issuer)
                || String.IsNullOrEmpty(providerKeyClaim.Value))
            {
                return null;
            }

            if (providerKeyClaim.Issuer == ClaimsIdentity.DefaultIssuer)
            {
                return null;
            }

            return new ExternalLoginData
            {
                LoginProvider = providerKeyClaim.Issuer,
                ProviderKey = providerKeyClaim.Value,
                UserName = identity.FindFirstValue(ClaimTypes.Name),
                Email = userEmail,
                FacebookAccessToken = userFacebookAccessToken

            };
        }
    }