如何在ASP.NET Core中从外部登录获取用户名?

如何在ASP.NET Core中从外部登录获取用户名?,asp.net,asp.net-core,asp.net-identity,google-login,Asp.net,Asp.net Core,Asp.net Identity,Google Login,我已经在ASP.NET核心应用程序中设置了外部登录(Google)。我发现登录后很难获得用户名/电子邮件。我可以看到存储在AspNetUsers表中的电子邮件,但在任何地方都看不到用户名 我搜索了一遍,找到了以下代码: var userId = this.User.FindFirstValue(ClaimTypes.NameIdentifier); 但这给了我用户ID,如表AspNetUsers中所示ClaimTypes.Email返回null,但该值存在于表中(可能此电子邮件是其他邮件)。我

我已经在ASP.NET核心应用程序中设置了外部登录(Google)。我发现登录后很难获得用户名/电子邮件。我可以看到存储在AspNetUsers表中的电子邮件,但在任何地方都看不到用户名

我搜索了一遍,找到了以下代码:

var userId = this.User.FindFirstValue(ClaimTypes.NameIdentifier);

但这给了我用户ID,如表AspNetUsers中所示
ClaimTypes.Email
返回null,但该值存在于表中(可能此电子邮件是其他邮件)。我想获取用户名和用户电子邮件。有可能吗?

您有权访问SignInManager还是可以将其注入?如果是,则这是访问用户id(用户名)、电子邮件、名字和姓氏的方式:

public class MyController : Microsoft.AspNetCore.Mvc.Controller
{
    private readonly UserManager<ApplicationUser> _userManager;
    private readonly SignInManager<ApplicationUser> _signInManager;

    public MyController (
        UserManager<ApplicationUser> userManager,
        SignInManager<ApplicationUser> signInManager
    )
    {
        _userManager = userManager;
        _signInManager = signInManager;        
    }

    public async Task<IActionResult> MyAction(){
    ExternalLoginInfo info = await _signInManager.GetExternalLoginInfoAsync();
    string userId = info.Principal.GetUserId()
    string email = info.Principal.FindFirstValue(ClaimTypes.Email);
    string FirstName = info.Principal.FindFirstValue(ClaimTypes.GivenName) ?? info.Principal.FindFirstValue(ClaimTypes.Name);
    string LastName = info.Principal.FindFirstValue(ClaimTypes.Surname);
    }
}

谢谢你的回复。你所说的,已经在AccountController中发生了。但问题是没有GetUserId方法。索赔类型中有电子邮件、GivenName和姓氏等属性,但它们都为空。是否使用GetExternalLoginInfoAsync检索ExternalLoginInfo
ExternalLoginInfo info=wait _signInManager.getexternallogininfosync()是的,这就是“info”对象。对不起,我忘了GetUserId是我自己的扩展,请使用principal.FindFirst(ClaimTypes.NameIdentifier)?.Value;我在StartUp.cs中缺少这个作用域={“email”,“profile”},添加了这个作用域后,我可以在帐户控制器的ExternalLoginCallback方法下看到“info”中的名称(即用户名)。我在我的另一个控制器中尝试了你的代码,但它仍然没有给我用户名。我想在我的另一个控制器中有用户名。我现在正在想办法。
public static class ClaimsPrincipalExtensions
{
    public static string GetUserId(this ClaimsPrincipal principal)
    {
        if (principal == null)
            return null; //throw new ArgumentNullException(nameof(principal));

        string ret = "";

        try
        {
            ret = principal.FindFirst(ClaimTypes.NameIdentifier)?.Value;
        }
        catch (System.Exception)
        {                
        }
        return ret;
    }
}