Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.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
Facebook .net core 2.0外部登录-其他配置文件信息_Facebook_Twitter_Gmail_Asp.net Identity_Asp.net Core 2.0 - Fatal编程技术网

Facebook .net core 2.0外部登录-其他配置文件信息

Facebook .net core 2.0外部登录-其他配置文件信息,facebook,twitter,gmail,asp.net-identity,asp.net-core-2.0,Facebook,Twitter,Gmail,Asp.net Identity,Asp.net Core 2.0,我有一个.NETCore2.0应用程序,正在实现外部登录提供商,如谷歌、推特和facebook。我需要获得用户的显示名称和配置文件图片,但在.NETCore2.0中找不到任何关于如何实现这一点的文档 我添加了如下所示的身份验证: 以下是我的twitter登录和回调函数 [HttpGet] [Route("/api/security/login/type/socialmedia/twitter")] public IActionResult GetTwitterLogin(

我有一个.NETCore2.0应用程序,正在实现外部登录提供商,如谷歌、推特和facebook。我需要获得用户的显示名称和配置文件图片,但在.NETCore2.0中找不到任何关于如何实现这一点的文档

我添加了如下所示的身份验证:

以下是我的twitter登录和回调函数

    [HttpGet]
    [Route("/api/security/login/type/socialmedia/twitter")]
    public IActionResult GetTwitterLogin(string redirect_uri)
    {
        ClientCallback = redirect_uri;
        string redirectUrl = "/api/security/login/type/socialmedia/twittercallback";
        var properties = SignInManager.ConfigureExternalAuthenticationProperties("Twitter", redirectUrl);
        return Challenge(properties, "Twitter");
    }

    [HttpGet]
    [Route("/api/security/login/type/socialmedia/twittercallback")]
    public async Task<HttpResponseMessage> GetTwitterCallBackAsync()
    {
        var info = await SignInManager.GetExternalLoginInfoAsync();

        var result = await SignInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false, bypassTwoFactor: true);
        if (result.Succeeded)
        {

        }
        else
        {

        }


        Response.StatusCode = (int)HttpStatusCode.OK;
        return null;
    }
[HttpGet]
[路由(“/api/security/login/type/socialmedia/twitter”)]
公共IActionResult GetTwitterLogin(字符串重定向\u uri)
{
ClientCallback=redirect_uri;
string redirectUrl=“/api/security/login/type/socialmedia/twittercallback”;
var properties=SignInManager.ConfigureExternalAuthenticationProperties(“Twitter”,重定向URL);
返回挑战(属性,“推特”);
}
[HttpGet]
[路由(“/api/security/login/type/socialmedia/twittercallback”)]
公共异步任务GetTwitterCallBackAsync()
{
var info=await SignInManager.getexternallogininfosync();
var result=await-signingmanager.ExternalLoginSignInAsync(info.LoginProvider、info.ProviderKey、isPersistent:false、bypassTwoFactor:true);
if(result.successed)
{
}
其他的
{
}
Response.StatusCode=(int)HttpStatusCode.OK;
返回null;
}
看起来您可以从info.Principal.Claims中获取一些项目,但用户的显示名称或配置文件图片没有任何内容


如何获得各种登录提供商的显示名称或配置文件图片?

我终于弄明白了……在配置身份验证时,您需要添加声明。这些声明查看结果json响应并从中提取项目。相关行是索赔项目

 services.AddAuthentication()
               .AddTwitter(twitterOptions =>
               {
                   twitterOptions.ConsumerKey = cfg.SystemConfig["TwitterConsumerKey"];
                   twitterOptions.ConsumerSecret = cfg.SystemConfig["TwitterConsumerSecret"];
                   twitterOptions.SaveTokens = true;
                   twitterOptions.RetrieveUserDetails = true;
                   twitterOptions.ClaimActions.MapJsonKey("display-name", "name");
                   twitterOptions.ClaimActions.MapJsonKey("profile-image-url", "profile_image_url_https");
               })
               .AddFacebook(facebookOptions =>
               {
                   facebookOptions.AppId = cfg.SystemConfig["FacebookClientId"];
                   facebookOptions.AppSecret = cfg.SystemConfig["FacebookClientSecret"];
                   facebookOptions.SaveTokens = true;
                   facebookOptions.ClaimActions.MapJsonKey("display-name", "name");

               })
               .AddGoogle(googleOptions => 
               {
                   googleOptions.ClientId = cfg.SystemConfig["GoogleClientId"];
                   googleOptions.ClientSecret = cfg.SystemConfig["GoogleClientSecret"];
                   googleOptions.SaveTokens = true;
                   googleOptions.ClaimActions.MapJsonSubKey("profile-image-url", "image", "url");
                   googleOptions.ClaimActions.MapJsonKey("display-name", "displayName" );
               });
使用在回调中获取登录信息后

var info = await SignInManager.GetExternalLoginInfoAsync();
如果填充成功,您可以查询索赔并查找值

 var profileImageClaim = info.Principal.Claims.Where(x => x.Type == "profile-image-url").FirstOrDefault();
Facebook图片不同于谷歌和twitter,可以使用

var claim = info.Principal.Claims.Where(x => x.Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier").FirstOrDefault();
var url = "http://graph.facebook.com/" + claim.Value + "/picture";

我终于明白了…在配置身份验证时,您需要添加声明。这些声明查看结果json响应并从中提取项目。相关行是索赔项目

 services.AddAuthentication()
               .AddTwitter(twitterOptions =>
               {
                   twitterOptions.ConsumerKey = cfg.SystemConfig["TwitterConsumerKey"];
                   twitterOptions.ConsumerSecret = cfg.SystemConfig["TwitterConsumerSecret"];
                   twitterOptions.SaveTokens = true;
                   twitterOptions.RetrieveUserDetails = true;
                   twitterOptions.ClaimActions.MapJsonKey("display-name", "name");
                   twitterOptions.ClaimActions.MapJsonKey("profile-image-url", "profile_image_url_https");
               })
               .AddFacebook(facebookOptions =>
               {
                   facebookOptions.AppId = cfg.SystemConfig["FacebookClientId"];
                   facebookOptions.AppSecret = cfg.SystemConfig["FacebookClientSecret"];
                   facebookOptions.SaveTokens = true;
                   facebookOptions.ClaimActions.MapJsonKey("display-name", "name");

               })
               .AddGoogle(googleOptions => 
               {
                   googleOptions.ClientId = cfg.SystemConfig["GoogleClientId"];
                   googleOptions.ClientSecret = cfg.SystemConfig["GoogleClientSecret"];
                   googleOptions.SaveTokens = true;
                   googleOptions.ClaimActions.MapJsonSubKey("profile-image-url", "image", "url");
                   googleOptions.ClaimActions.MapJsonKey("display-name", "displayName" );
               });
使用在回调中获取登录信息后

var info = await SignInManager.GetExternalLoginInfoAsync();
如果填充成功,您可以查询索赔并查找值

 var profileImageClaim = info.Principal.Claims.Where(x => x.Type == "profile-image-url").FirstOrDefault();
Facebook图片不同于谷歌和twitter,可以使用

var claim = info.Principal.Claims.Where(x => x.Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier").FirstOrDefault();
var url = "http://graph.facebook.com/" + claim.Value + "/picture";
在ASP.NET Core 2.0中,对索赔使用扩展方法来映射UserInformationEndpoint返回的配置文件数据

ClaimActions.MapJsonKey(ClaimTypes.DateOfBirth, "birthday");
在上面的映射中,“生日”是Facebook Graph API响应中的顶级属性,它映射到ClaimTypes.DateOfBirth所表示的值

要获取概要文件图片,您也可以做同样的事情,但是由于Graph API响应中的图片是嵌套的JSON对象,因此必须使用
MapCustomJson()

这里,
claim
是一个NewtonSoft
JObject
,它使用
JPath
语法选择嵌套属性值并将其转换为字符串

配置文件图片URL现在将显示在您的
索赔
列表中。

在ASP.NET Core 2.0中,对索赔使用扩展方法来映射UserInformationEndpoint返回的配置文件数据

ClaimActions.MapJsonKey(ClaimTypes.DateOfBirth, "birthday");
在上面的映射中,“生日”是Facebook Graph API响应中的顶级属性,它映射到ClaimTypes.DateOfBirth所表示的值

要获取概要文件图片,您也可以做同样的事情,但是由于Graph API响应中的图片是嵌套的JSON对象,因此必须使用
MapCustomJson()

这里,
claim
是一个NewtonSoft
JObject
,它使用
JPath
语法选择嵌套属性值并将其转换为字符串


个人资料图片URL现在将显示在您的
索赔
列表中。

图片的URL为50x50。你知道有一个声明有一个更大的图片吗,或者我必须进行后续的api调用才能获得更大的图片吗?图片的url是50x50。您是否知道有一个声明具有更大的图景,或者我必须进行后续api调用才能获得更大的图景?