Как сгенерировать динамический ответ json

#asp.net #asp.net-web-api #jwt #webapi

Вопрос:

У меня есть метод входа в систему IActionResult, приведенный в приведенном ниже коде, на котором здесь основное внимание уделяется. Я хочу вернуть определенный тип ответа после публикации этого метода. Ответ должен выглядеть примерно так…

 {  
 "token" : Token Id must be displayed here,          
 "user" : {                   
    UserName : user name must appear here                   
    UserRole : user role appears here
  }
}
 

Когда я вхожу в систему с (например) именем пользователя -> администратор и паролем ->> 1234, он должен извлечь имя пользователя и роль пользователя из списка, соответствующего указанным учетным данным. Пожалуйста, помогите мне с этим, я вроде как новичок в ASP.NET.

 [ApiController]
[Route("api/LoginController")]
public class LoginController : Controller
{
    private readonly IList<Credential> appUsers = new List<Credential>
                    {
                          new Credential { FullName = "Admin User", UserName = "admin", Password = "1234", UserRole = "Admin" },
                          new Credential { FullName = "Test User", UserName = "user", Password = "1234", UserRole = "User" }
                   };

    [HttpPost]
    [AllowAnonymous]
    public IActionResult Login(Credential credential)
    {
        var user = appUsers.FirstOrDefault(x => x.UserName == credential.UserName amp;amp; x.Password == credential.Password);
        if (user != null)
        {
            var tokenString = GenerateJWTToken(user);
            
            var response = new { token = tokenString };
            return Ok(response);
        }
        else
        {
            string message = "enter correct credentials";
            return Ok(message);
        }
    }

    private string GenerateJWTToken(Credential credential)
    {
        const string ENCRYPTION_KEY = "xecretKeywqejane";
        const string JWT_ISSUER = "https://localhost:44331/";             
        const string JWT_AUDIENCE = "https://localhost:44331/";           

        var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(ENCRYPTION_KEY));
        var signingCredentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);

        
        var claims = new[]
        {
                          new Claim (JwtRegisteredClaimNames.Sub, credential.UserName),
                          new Claim ("fullName", credential.FullName),
                          new Claim ("role", credential.UserRole),
                          new Claim (JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
                    };

        var token = new JwtSecurityToken(
              issuer: JWT_ISSUER,
              audience: JWT_AUDIENCE,
              claims: claims,
              expires: DateTime.Now.AddMinutes(30),
              signingCredentials: signingCredentials
        );

        return new JwtSecurityTokenHandler().WriteToken(token);
    }
}
 

}

Ответ №1:

Вы также можете определить новый класс ответа.

 public class ResponseDto
{
    public string Token {get; set;}
    public User User {get; set;}
}

public class User 
{
    public string UserName {get; set;}
    public string UserRole {get; set;}
}

return Ok(new ResponseDto()
{
    Token = tokenString,
    User = new User()
    {
        UserName = user.UserName,
        UserRole = User.UserRole
    }
});
 

Ответ №2:

Вы почти на месте. Он Ok() отправит обратно сериализованную версию модели в формате JSON и примет анонимные объекты. Таким образом, в основном вам нужно вернуть следующее

 return Ok(new
{
    token = "",
    user = new
    {
        UserName = "",
        UserRole = ""
    }
});
 

Комментарии:

1. Работает как волшебство, большое вам спасибо!