我正在获取令牌,但是它不是json
格式。我正在使用一个插件以json
格式放置所有响应。而且除了gettoken API之外,所有其他API都运行良好
[HttpPost("gettoken")]
public IActionResult GetToken([FromBody]TokenRequest Input)
{
var oUser=_userRepository.AuthenticateUser(Input.UserName,Input.Password);
if (oUser!=null)
{
var claimsdata = new[] {
new Claim(ClaimTypes.Name, oUser.UserName),
new Claim(ClaimTypes.Role, oUser.Role)
};
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:SigningKey"]));
int expiryInMinutes = Convert.ToInt32(_configuration["Jwt:ExpiryInMinutes"]);
var signInCred = new SigningCredentials(key, SecurityAlgorithms.HmacSha256Signature);
var token = new JwtSecurityToken(
issuer: _configuration["Jwt:Issuer"],
audience: _configuration["Jwt:Audience"],
expires: DateTime.UtcNow.AddMinutes(expiryInMinutes),
claims: claimsdata,
signingCredentials: new SigningCredentials(key, SecurityAlgorithms.HmacSha256)
);
var tokenString = new JwtSecurityTokenHandler().WriteToken(token);
return Ok(tokenString);
}
return BadRequest("wrong request");
// return View();
}
答案 0 :(得分:2)
尝试使用setBackgrounds()
代替npm i moduleName@version --save
答案 1 :(得分:1)
首先,我建议定义一个模型,该模型将最好地描述您的安全令牌。 假设是这样:
class SecurityToken
{
public string Token { get; set; }
public long Expires { get; set; }
}
您将在其中将令牌字符串存储在令牌属性中。这是“到期”属性中的到期日期。当然,这些字段不是必须的。
然后,创建您的控制器。我更喜欢从.NET Core继承ControllerBase
。
[Route("api/v1/[controller]")]
public class SecurityController : ControllerBase
{
[HttpPost]
[Route("[action]")]
public async Task<IActionResult> Authorize([FromBody] AuthData credentials)
{
try
{
var tokenString = await ObtainToken(credentials, out long expires);
return Ok(new SecurityToken() {
Token = tokenString,
Expires = expires
});
}catch(Exception ex)
{
return StatusCode(400, "Fail");
}
}
}
让我描述一下。在路线api / v1 / security / authorize上传递一些“抽象”凭据数据,即用户名和密码,可以用来获取令牌。方法ObtainToken
只是一个示例,不是真实的方法。我以为它是异步的,因此控制器的操作返回Task<T>
。我将“ IActionResult”作为更通用的名称:我们被允许返回OK(object)
或StatusCode,BadRequest等(ControllerBase方法)。
您还可以定义以下内容:
public SecurityToken Authorize([FromBody] AuthData credentials)
{
var tokenString = ObtainToken(credentials, out long expires);
return new SecurityToken
{
Token = tokenString,
Expires = expires
};
}
它将成功!
问题是到JSON的序列化是在幕后完成的,您不需要自己做。
谈论您的代码,我想您可以从基本开始:
return Ok(tokenString)
以返回模型。答案 2 :(得分:1)
您所拥有的已经是有效的JWT令牌。您需要在客户端(JavaScript)上对其进行解码(仅base64)。为了验证它,您需要一个库,该库将使用令牌来验证签名以确保其未被篡改。
JWT令牌由三部分组成,以“。”分隔。 (您已经在屏幕截图中看到了):标头,有效负载和签名。
有关更多信息,请参见https://jwt.io。它还包含一个库列表,这些库支持在客户端(JavaScript,C#和其他语言)对JWT令牌进行解码和改进。
当前示例为JavaScript / NodeJ的jsonwebtoken和@panva/jose
P.S。即使是简单的"Some string"
也是null
一样有效的json。