显然,您可以通过向Startup.Auth.cs中的FacebookAuthenticationOptions对象添加范围来通过Facebook提供者执行此操作:
- List<string> scope = new List<string>() { "email" };
- var x = new FacebookAuthenticationOptions();
- x.Scope.Add("email");
- ...
- app.UseFacebookAuthentication(x);
如何与Google提供商一样? GoogleAuthenticationOptions类/对象没有x.Scope属性!
解决方法
请在本帖子的底部看到更新!
以下适用于我的Facebook:
StartupAuth.cs:
- var facebookAuthenticationOptions = new FacebookAuthenticationOptions()
- {
- AppId = "x",AppSecret = "y"
- };
- facebookAuthenticationOptions.Scope.Add("email");
- app.UseFacebookAuthentication(facebookAuthenticationOptions);
ExternalLoginCallback方法:
- var externalIdentity = HttpContext.GetOwinContext().Authentication.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);
- var emailClaim = externalIdentity.Result.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Email);
- var email = emailClaim.Value;
而对于Google:
StartupAuth.cs
- app.UseGoogleAuthentication();
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;
如果我在这里设置一个断点:
- var email = emailClaim.Value;
我在调试器中看到Facebook和Google的电子邮件地址。
更新1:旧的答案让我困惑,所以我更新了我在我自己的项目中的代码,我刚刚调试,我知道工作。
更新2:使用新的ASP.NET Identity 2.0 RTM版本,您不再需要此帖中的任何代码。获取电子邮件的正确方法是简单地执行以下操作:
> Startup.Auth.cs
- app.UseFacebookAuthentication(
- appId: "x",appSecret: "y");
- app.UseGoogleAuthentication();
> 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 ExternalLoginConfirmation@R_403_93@l { Email = loginInfo.Email });
- }
- }