如何从第三方访问令牌asp.net web api2获取用户电子邮件?

时间:2018-02-04 08:00:27

标签: c# asp.net asp.net-web-api access-token

我正在尝试修改默认方法GetUserInfo()以及Visual Studio Web api模板。我的问题是,当我的应用程序中没有注册时,我可以收到用户的电子邮件。但是如果用户注册,则externalLogin为null。

[HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)]
[Route("UserInfo")]
public UserInfoViewModel GetUserInfo()
{
 ExternalLoginData externalLogin = 
    ExternalLoginData.FromIdentity(User.Identity as ClaimsIdentity);
        string email = externalLogin.Email; 
    // i can get email if user is not registered.
        return new UserInfoViewModel
                    {
                        Email = User.Identity.GetUserName(),
                        HasRegistered = externalLogin == null,
                        LoginProvider = externalLogin != null ? 
                        externalLogin.LoginProvider : null
                    };
   }

我可以通过以下代码获取该第三方令牌的用户名。

var username = User.Identity.Name;

但是我需要收到那封用途的电子邮件。

1 个答案:

答案 0 :(得分:0)

我可以通过在方法GenerateUserIdentityAsync()中添加声明来获取电子邮件。

public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager, string authenticationType)
 {
  // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
 var userIdentity = await manager.CreateIdentityAsync(this, authenticationType);
 userIdentity.AddClaim(new Claim(ClaimTypes.Name, UserName));
 userIdentity.AddClaim(new Claim(ClaimTypes.Email, Email));               
   // Add custom user claims here
   return userIdentity;
  }

然后在GetUserInfo()方法中,我可以使用下面的代码来提取电子邮件。

var userWithClaims = (ClaimsPrincipal)User;
var email = userWithClaims.FindFirst(ClaimTypes.Email).Value;