gpt4 book ai didi

c# - 通过 ASP.NET Membership.OpenAuth 获取用户个人资料信息

转载 作者:太空宇宙 更新时间:2023-11-03 16:20:14 24 4
gpt4 key购买 nike

使用 Microsoft.AspNet.Membership.OpenAuth,我很快就能获得一个应用程序,让人们通过各种外部提供商(facebook、twitter、google、microsoft)登录。太好了。

我的问题是,我可以使用这个框架轻松获取用户个人资料信息吗?我想获取他们的个人资料照片、电子邮件地址、DOB 等(如果服务有的话)。

我知道 AuthenticationResult.ExtraData 中有一些额外的信息,但它不是标准信息,不包含我需要的信息。

我可以从这里做些什么来使用 Microsoft.AspNet.Membership.OpenAuth(或另一个 .net 库)获取信息,还是我需要使用 ExtraData 中的访问 token 通过单独的服务 API?

谢谢

最佳答案

身份验证工作流程有两个主要问题需要克服。一个,正如 OP 正确指出的那样,涉及 ExtraData 的内容,另一个涉及您需要向 Facebook 请求的权限。最后,我使用了 DotNetOpenAuth 库而不是 Microsoft 库,但在某些地方通过滚动我自己的类并在必要时借用框架的部分来扩展它。

我做的第一件事是创建一个 FacebookClient,它从 DotNetOpenAuth 扩展了 OAuth2Client 并允许我为 传递一个值>scope,它超越了您可以从 Facebook 请求哪些数据的限制。我请求的权限是 publish_stream、manage_pages、email、user_interests。它们只是附加到服务登录 URL 并传递给 Facebook。 OAuth2Client 实现中有用的方法是 GetUserData:

    protected override IDictionary<string, string> GetUserData(string accessToken)
{
var token = accessToken.EscapeUriDataStringRfc3986();
FacebookGraphData graphData;
var request = WebRequest.Create(string.Format("https://graph.facebook.com/me?access_token={0}", token));
using (var response = request.GetResponse())
{
using (var responseStream = response.GetResponseStream())
{
graphData = JsonHelper.Deserialize<FacebookGraphData>(responseStream);
}
}

var userData = new Dictionary<string, string> {{"accessToken", accessToken}};
userData.AddItemIfNotEmpty("id", graphData.Id);
userData.AddItemIfNotEmpty("name", graphData.Name);
userData.AddItemIfNotEmpty("email", graphData.Email);
userData.AddItemIfNotEmpty("firstName", graphData.FirstName);
userData.AddItemIfNotEmpty("lastName", graphData.LastName);
userData.AddItemIfNotEmpty("link", graphData.Link == null ? null : graphData.Link.AbsoluteUri);
userData.AddItemIfNotEmpty("username", graphData.Username);
userData.AddItemIfNotEmpty("gender", graphData.Gender);
userData.AddItemIfNotEmpty("locale", graphData.Locale);

FacebookFriendData friendData;
request = WebRequest.Create(string.Format("https://graph.facebook.com/me/friends?access_token={0}", token));
using (var response = request.GetResponse())
{
using (var responseStream = response.GetResponseStream())
{
friendData = JsonHelper.Deserialize<FacebookFriendData>(responseStream);
}
}

if (friendData.Friends != null)
{
userData.Add("connections", friendData.Friends.Count().ToString());
}

return userData;
}

我基本上创建了一些数据类,当响应从 Facebook 返回时,这些数据类被反序列化。我还可以根据需要从此处进行任何其他 Graph API 调用。序列化类如下所示:

[DataContract]
public class FacebookFriendData
{
[DataMember(Name = "data")]
public IEnumerable<Friend> Friends { get; set; }
}

[DataContract]
public class Friend
{
[DataMember(Name = "id")]
public string Id { get; set; }

[DataMember(Name = "name")]
public string Name { get; set; }
}

[DataContract]
public class FacebookGraphData
{
[DataMember(Name = "id")]
public string Id { get; set; }

[DataMember(Name = "name")]
public string Name { get; set; }

[DataMember(Name = "email")]
public string Email { get; set; }

[DataMember(Name = "first_name")]
public string FirstName { get; set; }

[DataMember(Name = "last_name")]
public string LastName { get; set; }

[DataMember(Name = "link")]
public Uri Link { get; set; }

[DataMember(Name = "username")]
public string Username { get; set; }

[DataMember(Name = "gender")]
public string Gender { get; set; }

[DataMember(Name = "locale")]
public string Locale { get; set; }
}

根据@radm4,我仍然检查提供者字符串来决定在某些地方调用哪些方法——仍在为那个方法寻找更优雅的解决方案...

关于c# - 通过 ASP.NET Membership.OpenAuth 获取用户个人资料信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14263748/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com