显然,您可以通过向Startup.Auth.cs中的FacebookAuthenticationOptions对象添加范围来通过Facebook提供者执行此操作:
@H_404_2@http://blogs.msdn.com/b/webdev/archive/2013/10/16/get-more-information-from-social-providers-used-in-the-vs-2013-project-templates.aspx
List<string> scope = new List<string>() { "email" }; var x = new FacebookAuthenticationOptions(); x.Scope.Add("email"); ... app.UseFacebookAuthentication(x);@H_404_2@如何与Google提供商一样? GoogleAuthenticationOptions类/对象没有x.Scope属性!
解决方法
请在本帖子的底部看到更新!
@H_404_2@以下适用于我的Facebook:
@H_404_2@StartupAuth.cs:
var facebookAuthenticationOptions = new FacebookAuthenticationOptions() { AppId = "x",AppSecret = "y" }; facebookAuthenticationOptions.Scope.Add("email"); app.UseFacebookAuthentication(facebookAuthenticationOptions);@H_404_2@ExternalLoginCallback方法:
var externalIdentity = HttpContext.GetOwinContext().Authentication.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie); var emailClaim = externalIdentity.Result.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Email); var email = emailClaim.Value;@H_404_2@而对于Google: @H_404_2@StartupAuth.cs
app.UseGoogleAuthentication();@H_404_2@ExternalLoginCallback方法(与Facebook相同):
var externalIdentity = HttpContext.GetOwinContext().Authentication.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie); var emailClaim = externalIdentity.Result.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Email); var email = emailClaim.Value;@H_404_2@如果我在这里设置一个断点:
var email = emailClaim.Value;@H_404_2@我在调试器中看到Facebook和Google的电子邮件地址。 @H_404_2@更新1:旧的答案让我困惑,所以我更新了我在我自己的项目中的代码,我刚刚调试,我知道工作。 @H_404_2@更新2:使用新的ASP.NET Identity 2.0 RTM版本,您不再需要此帖中的任何代码。获取电子邮件的正确方法是简单地执行以下操作: @H_404_2@> Startup.Auth.cs
app.UseFacebookAuthentication( appId: "x",appSecret: "y"); app.UseGoogleAuthentication();@H_404_2@> AccountController.cs
// // GET: /Account/ExternalLoginCallback [AllowAnonymous] public async Task<ActionResult> ExternalLoginCallback(string returnUrl) { var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); if (loginInfo == null) { return RedirectToAction("Login"); } // Sign in the user with this external login provider if the user already has a login var result = await SignInHelper.ExternalSignIn(loginInfo,isPersistent: false); switch (result) { case SignInStatus.Success: return RedirectToLocal(returnUrl); case SignInStatus.LockedOut: return View("Lockout"); case SignInStatus.RequiresTwoFactorAuthentication: return RedirectToAction("SendCode",new { ReturnUrl = returnUrl }); case SignInStatus.Failure: default: // If the user does not have an account,then prompt the user to create an account ViewBag.ReturnUrl = returnUrl; ViewBag.LoginProvider = loginInfo.Login.LoginProvider; return View("ExternalLoginConfirmation",new ExternalLoginConfirmationviewmodel { Email = loginInfo.Email }); } }