如何在ASP.NET Core中从外部登录获取用户名?
我已经在ASP.NET核心应用程序中设置了外部登录(Google)。我发现登录后很难获得用户名/电子邮件。我可以看到存储在AspNetUsers表中的电子邮件,但在任何地方都看不到用户名 我搜索了一遍,找到了以下代码:如何在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,但该值存在于表中(可能此电子邮件是其他邮件)。我
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;
}
}