如何生成动态 json 响应
How to generate a a dynamic json response
我在下面的代码中给出了 IActionResult 登录方法,这是这里的主要焦点。我想在 POST 使用此方法后 return 特定类型的响应。响应应该看起来像这样...
{
"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 && 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);
}
}
}
你快到了。 Ok()
将发回模型的 JSON 序列化版本并获取匿名对象。所以基本上你需要return以下
return Ok(new
{
token = "",
user = new
{
UserName = "",
UserRole = ""
}
});
您还可以定义新的响应class。
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
}
});
我在下面的代码中给出了 IActionResult 登录方法,这是这里的主要焦点。我想在 POST 使用此方法后 return 特定类型的响应。响应应该看起来像这样...
{
"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 && 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);
}
}
}
你快到了。 Ok()
将发回模型的 JSON 序列化版本并获取匿名对象。所以基本上你需要return以下
return Ok(new
{
token = "",
user = new
{
UserName = "",
UserRole = ""
}
});
您还可以定义新的响应class。
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
}
});