使用owin进行外部auth数据检索的问题

时间:2014-10-17 20:41:56

标签: c# .net facebook asp.net-mvc-5 owin

任何人都可以提供一个如何从Facebook检索个人资料图片网址的示例吗? 不知怎的,我不能这样做。我可以检索名字,姓氏,电子邮件,性别,它应该允许检索个人资料图片,但它不是。在索赔清单中没有图片这样的东西。 我找不到任何例子。这是我的代码:

Startup.Auth.cs

var x = new FacebookAuthenticationOptions();
x.Scope.Add("email");
//x.Scope.Add("picture");
x.AppId = "*";
x.AppSecret = "***";
x.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"));
          }
     }
};

x.SignInAsAuthenticationType = DefaultAuthenticationTypes.ExternalCookie;
app.UseFacebookAuthentication(x);

编码我如何检索一些数据:

var loginInfo = await AuthenticationManager.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);
var firstNameClaim = loginInfo.Claims.First(c => c.Type == "urn:facebook:first_name");
var lastNameClaim = loginInfo.Claims.First(c => c.Type == "urn:facebook:last_name");
var gender = loginInfo.Claims.First(c => c.Type == "urn:facebook:gender");

有什么想法吗?我使用Facebook SDK for .NET实现了所需的结果,但我很好奇如何在不使用Facebook SDK for .NET的情况下实现相同的结果。希望社区将在这方面提供帮助。

2 个答案:

答案 0 :(得分:1)

看起来您无法将图片网址作为带参数的对象,因为每次用户更改其个人资料图片时图片网址都会发生变化,因此存储静态网址没有任何意义。

对于我的解决方案,我写了一个方法来获取个人资料图片的动态网址,这里是代码:

private string GetFacebookProfilePicture(ClaimsIdentity externalInfoSoruce) {
        var facebookUserID = externalInfoSoruce.Claims.First(c => c.Type == "urn:facebook:id").Value;
        string profilePicturePath = string.Format("http://graph.facebook.com/{0}/picture?type=large", facebookUserID);
        return profilePicturePath;
    }

现在,每当我想向用户展示他的个人资料图片时,我都可以将该链接插入到<img> src参数中。每次用户登录时,照片都会自动更新。

答案 1 :(得分:0)

不确定这是否是您应该这样做的方式。但是,http://graph.facebook.com/FACEBOOKID/picture提供了Facebook个人资料图片,因此您只需获取用户的ID并将其交换到该网址即可。

例如,我的Facebook ID是729196216,所以如果你请求http://graph.facebook.com/729196216/picture,你会得到我丑陋的杯子。 :)