Мне было интересно, как передать сведения о пользователе, когда ответ на знак пользователя равен 200. Я использую Asp. net идентификатор ядра, вот мой код для контроллера httpPost для аутентификации: он отправляет имя пользователя только при входе пользователя с ответом 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();
}
}
}
Я хочу получить всю пользовательскую информацию, а не только userName, которая находится в UserDTO.cs при входе пользователя с ответом 200.
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; }
}
}
Вот мое создание контроллер аккаунта
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
}) ;
}
}
}
}
для роли у меня есть role.cs и role.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>();
}
}
спасибо!