我在ASP.NET MVC 5(使用RC1版本目前)开发一个网站。该网站将使用Facebook进行用户身份验证和检索初始配置文件数据。
对于身份验证系统,我使用新的基于OWIN的ASP.NET身份引擎(http://blogs.msdn.com/b/webdev/archive/2013/07/03/understanding-owin-forms-authentication-in-mvc-5.aspx),因为它大大简化了与外部提供程序进行身份验证的过程。
问题是,一旦用户首次登录,我想从Facebook配置文件获取其电子邮件地址,但此数据不包括在生成的声明中。所以我想过这些替代方案来获得地址:
>指示ASP.NET身份引擎在其中包含电子邮件地址
从Facebook检索然后转换的数据集
到索赔。我不知道这是否可能。
>使用Facebook图API
(https://developers.facebook.com/docs/getting-started/graphapi)至
通过使用Facebook用户ID检索电子邮件地址(即
包括在索赔数据中)。但这不会工作,如果用户有
将他的电子邮件地址设为私人。
>使用Facebook图形API,但指定“我”而不是
Facebook用户ID
(https://developers.facebook.com/docs/reference/api/user)。但是
访问令牌是必需的,我不知道如何(或如果它是
可能在所有)检索ASP.NET使用的访问令牌
获取用户数据。
所以问题是:
>我如何指示ASP.NET身份引擎检索
来自Facebook的附加信息,并将其包含在索赔中
数据?
>或者,如何检索生成的访问令牌等
我可以问Facebook吗?
谢谢!
注意:对于身份验证系统,我的应用程序使用基于此SO答案中链接的示例项目的代码:http://stackoverflow.com/a/18423474/4574
解决方法
要从Facebook检索其他信息,您可以指定在配置facebook身份验证选项时要包括的范围。获取检索到的附加信息可以通过实现提供程序的OnAuthenticated方法来实现,如下所示:
var facebookOptions = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationOptions() { Provider = new FacebookAuthenticationProvider() { OnAuthenticated = (context) => { // All data from facebook in this object. var rawUserObjectFromFacebookAsJson = context.User; // Only some of the basic details from facebook // like id,username,email etc are added as claims. // But you can retrieve any other details from this // raw Json object from facebook and add it as claims here. // Subsequently adding a claim here will also send this claim // as part of the cookie set on the browser so you can retrieve // on every successive request. context.Identity.AddClaim(...); return Task.FromResult(0); } } }; //Way to specify additional scopes facebookOptions.Scope.Add("..."); app.UseFacebookAuthentication(facebookOptions);