简体   繁体   English

登录成功后传递用户详细信息来自身份asp.net core 3.1

[英]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.

相关问题 在 asp.net 核心成功登录后,User.Identity.IsAuthenticated 在非身份验证方法中为 false - User.Identity.IsAuthenticated is false in a non-auth methods after successful login in asp.net core 带有 Identity Core 和 Asp.net Core 3.1 的多重登录页面 - Multiple Login Page with Identity Core and Asp.net Core 3.1 成功注册/登录后不显示注销按钮,ASP.NET Core 标识 - LOGOUT button not showing after successful REGISTER/LOGIN, ASP.NET Core Identity 种子 ASP.NET .NET Core 3.1 中的身份用户和角色 - Seed ASP.NET Identity user and roles in .NET Core 3.1 授权成功后,在 ASP.NET Core 3.1 MVC 中从 AWS Cognito 检索 JWT 令牌 - Retrieving JWT token from AWS Cognito in ASP.NET Core 3.1 MVC after successful authorization 成功登录后,ASP.NET Identity无法验证用户身份 - ASP.NET Identity does not authenticate user after successful sign in 成功登录后,asp.net core 2.2重定向到登录 - asp.net core 2.2 redirects to login after successful sign in ASP.NET Core3.1登录后如何获取用户信息 - How to get User Information after login in ASP.NET Core3.1 Asp.net 核心身份登录成功重定向回登录页面 - Asp.net core Identity successful login redirecting back to login page 在ASP.NET Core上使用Identity登录后,如何直接获取用户详细信息? - How do I get the user details straight after login using Identity on ASP.NET Core?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM