[英]Pass user detail after Login Is successful From identity asp.net core 3.1
I was wondering how to pass user detail when the user sign response is 200. I'm using Asp.net core identity, here is my code for httpPost controller for authentication: It only sends username when user login with response 200.我想知道当用户签名响应为 200 时如何传递用户详细信息。我正在使用 Asp.net 核心身份,这是我的 httpPost controller 代码进行身份验证:它只在用户登录时发送用户名,响应为 200。
namespace Test.Controllers
{
[Route("/api/authentication/")]
[ApiController]
public class AuthenticationController : ControllerBase
{
private readonly UserManager<User> userManager;
private readonly SignInManager<User> signInManager;
public AuthenticationController(UserManager<User> userManager, SignInManager<User> signInManager)
{
this.userManager = userManager;
this.signInManager = signInManager;
}
[HttpPost("login")]
public async Task<ActionResult<UserDTO>> Login(LoginDTO dto)
{
var user = await userManager.FindByNameAsync(dto.UserName);
if (user == null)
{
return BadRequest();
}
var password = await signInManager.CheckPasswordSignInAsync(user, dto.Password, true);
if (!password.Succeeded)
{
return BadRequest();
}
await signInManager.SignInAsync(user, false, "Password");
return Ok(new UserDTO { UserName = user.UserName });
}
[HttpPost("logout")]
public async Task<ActionResult> logout()
{
await signInManager.SignOutAsync();
return Ok();
}
}
}
I want to get all the user information not only userName that is in UserDTO.cs when user signIn with response 200.当用户使用响应 200 登录时,我想获取所有用户信息,而不仅仅是 UserDTO.cs 中的用户名。
namespace Test.Features.Users
{
public class UserDTO
{
public string UserName { get; set; }
public string Email { get; set; }
public string PhoneNumber { get; set; }
public string Password { get; set; }
public string Role { get; set; }
}
}
Here is my create account controller这是我的创建帐户 controller
namespace Test.Controllers
{
[Route("api/createaccount")]
[ApiController]
public class CreateAccountController : ControllerBase
{
private readonly DataContext dataContext;
private readonly SignInManager<User> signInManager;
private readonly UserManager<User> userManager;
public CreateAccountController(DataContext dataContext, SignInManager<User> signInManager, UserManager<User> userManager)
{
this.dataContext = dataContext;
this.signInManager = signInManager;
this.userManager = userManager;
}
[HttpPost]
public async Task<ActionResult<UserDTO>> CreateUser(CreateAccountDTO dto)
{
var newuser = new User
{
UserName = dto.UserName,
Email = dto.Email,
PhoneNumber = dto.PhoneNumber,
};
using (var transaction = await dataContext.Database.BeginTransactionAsync())
{
var identityresults = await userManager.CreateAsync(newuser, dto.Password);
if (!identityresults.Succeeded)
{
return BadRequest();
}
var roleresults = await userManager.AddToRoleAsync(newuser, Roles.Customer);
if (!roleresults.Succeeded)
{
return BadRequest();
}
transaction.Commit();
await signInManager.SignInAsync(newuser, isPersistent: false);
var user = await userManager.FindByEmailAsync(newuser.Email);
var rolesList = await userManager.GetRolesAsync(user);
var getRole = rolesList[0];
Console.WriteLine(getRole);
return Created(string.Empty, new UserDTO
{
UserName = newuser.UserName,
Email = newuser.Email,
PhoneNumber = newuser.PhoneNumber,
Password = newuser.PasswordHash,
Role = getRole
}) ;
}
}
}
}
for role i have role.cs and roles.cs对于角色,我有 role.cs 和 roles.cs
namespace Test.Features.Roles
{
public class Roles
{
public const string Admin = nameof(Admin);
public const string Customer = nameof(Customer);
private static bool HasAnyRole(ClaimsPrincipal user, string target)
{
foreach(var role in target.Split(","))
{
if (user.IsInRole(role))
{
return true;
}
}
return false;
}
}
}
namespace Test.Features.Roles
{
public class Role:IdentityRole<int>
{
public virtual ICollection<UserRole> Users { get; set; } = new List<UserRole>();
}
}
thank you!谢谢你!
So you need to use the UserManager for this.因此,您需要为此使用 UserManager。 If you look at what i am returning, this is what you want.
如果您看看我要返回的内容,这就是您想要的。 I have tested this and it works my end.
我已经对此进行了测试,并且可以达到我的目的。 Any questions let me know.
任何问题让我知道。
For the roles, a user can have multiple roles and the method below returns a list of roles.对于角色,一个用户可以有多个角色,下面的方法返回一个角色列表。
var roles = await _userManager.GetRolesAsync( test );
So your UserDTO will look like the below:因此,您的 UserDTO 将如下所示:
public class UserDTO
{
public string UserName { get; set; }
public string Email { get; set; }
public string PhoneNumber { get; set; }
public string Password { get; set; }
public List<string> Role { get; set; }
}
And your controller method will look like the below:您的 controller 方法如下所示:
[Route("/api/authentication/")]
[ApiController]
public class AuthenticationController : ControllerBase
{
private readonly UserManager<User> userManager;
private readonly SignInManager<User> signInManager;
public AuthenticationController(UserManager<User> userManager, SignInManager<User> signInManager)
{
this.userManager = userManager;
this.signInManager = signInManager;
}
[HttpPost("login")]
public async Task<ActionResult<UserDTO>> Login(LoginDTO dto)
{
var user = await userManager.FindByNameAsync(dto.UserName);
var roles = await _userManager.GetRolesAsync( user );
if (user == null)
{
return BadRequest();
}
var password = await signInManager.CheckPasswordSignInAsync(user, dto.Password, true);
if (!password.Succeeded)
{
return BadRequest();
}
await signInManager.SignInAsync(user, false, "Password");
return Ok(new UserDTO { UserName = user.UserName, Email = user.Email, PhoneNumber = user.PhoneNumber, Password = user.PasswordHash, Role = roles.ToList() });
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.