我正在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答案中链接的示例项目的代码:https://stackoverflow.com/a/18423474/4574
asp.net-mvc facebook-graph-api owin asp.net-mvc-5 asp.net-identity
我想根据OWIN cookie过期的时间创建一些倒数计时器.我正在使用OWIN和MVC 5,我从默认情况下开始了解SlidingExpiration.我不使用'session',因为我需要这个应用程序才能在Web场中生存(我不打算部署会话数据库).
在测试了内置的MVC 5 OAuth2/OpenID提供程序后,我能够创建一个网站,允许我使用我的Twitter凭据进行身份验证.
我现在遇到的问题是,我还想在用户成功通过身份验证后,在网址中存储令牌(oauth_token和oauth_verifier)Twitter帖子.我需要这些令牌,所以我可以允许用户直接从我的网站发布详细信息到他们的Twitter帐户.
在Startup.Auth.cs中设置了TwitterAuthenticationOptions(见下文)后,我确实发现我所关注的令牌可以在上下文中找到,但解析这似乎是一个丑陋的解决方案.(((context.Response.Context).Request).QueryString)
var tw = new TwitterAuthenticationOptions {
ConsumerKey = "SecretKey",
ConsumerSecret = "SecretSecret",
SignInAsAuthenticationType = DefaultAuthenticationTypes.ExternalCookie,
Provider = new TwitterAuthenticationProvider() {
OnAuthenticated = (context) => {
context.Identity.AddClaim(new System.Security.Claims.Claim("urn:twitter:access_token", context.AccessToken, XmlSchemaString, "Twitter"));
return Task.FromResult(0);
}
}
};
app.UseTwitterAuthentication(tw);
Run Code Online (Sandbox Code Playgroud)
如何优雅地实施?对于Facebook我找到了一个实际检索其他信息的解决方案,这感觉类似......
我已经构建了一个Web应用程序.当我建立它时,我勾选了"组织账户"
它运行良好 - 我使用我的Office 365帐户登录并User.Identity.Name
包含电子邮件地址
此应用程序是旧的ASP Classic应用程序的替代前端.该应用程序有一个我需要使用的现有安全表.
我想使用电子邮件地址查找此表中的记录以获取
用户的内部数据库密钥(因此我可以在数据库调用中使用它)
用户的安全级别(授权)
我想在验证后立即查看,并将这两个值保存Session
到以后再参考
我有一个现有的方法来完成所有这些查找和缓存.我实际上通过从_LoginPartial.cshtml
视图中调用它来实现它,但显然从视图中触发这种事情是不正确的
这是查找和缓存用户信息的代码.现在这是在,AccountController.cs
但它不一定是
private Boolean GetAdditionalUserInfo()
{
// if authentication info is saved, don't go find it
if (Session["UID"] != null) return true;
// get the db employee id from the database and save it to the session
var r = (
from e in db.Employees
where e.Email == User.Identity.Name
select new
{
e.Emp_ID,
e.Group_ID
}
).SingleOrDefault();
if ((r == null) || …
Run Code Online (Sandbox Code Playgroud)