c# - 值不能为空。(参数“值”)
问题描述
我创建了一种方法,用户可以登录到我的应用程序,然后将令牌发送给用户,以便它可以用于查看应用程序中的任何其他视图。当我在邮递员上测试登录方法时,我得到 500 服务器错误如下而不是令牌。我看过类似的问题/帖子,但没有看到与 JWT 相关的帖子
下面是输出
System.ArgumentNullException:值不能为空。System.Security.Claims.Claim 中的(参数“值”)(字符串类型,字符串值,字符串 valueType,字符串颁发者,字符串 originalIssuer,ClaimsIdentity 主题,字符串 propertyKey,字符串 propertyValue)在 System.Security.Claims.Claim ..ctor(String type, String value) at Coop_Marketing.Controllers.AccountController.Login(LoginViewModel formdata) in /Users/Ken/Desktop/Coop_Marketing/Coop_Marketing/Coop_Marketing/Controllers/AccountController.cs:line 101 at Microsoft.AspNetCore.Mvc Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|12_0(ControllerActionInvoker 调用程序,
具有登录方法的帐户控制器如下
public async Task<IActionResult> Login([FromBody] LoginViewModel formdata)
{
// Get the User from database
var user = await _userManager.FindByNameAsync(formdata.Username);
var roles = await _userManager.GetRolesAsync(user);
var key = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(_appSettings.Secret));
double tokenExpiryTime = Convert.ToDouble(_appSettings.ExpireTime);
if(user !=null && await _userManager.CheckPasswordAsync(user,formdata.Password))
{
var tokenhandler = new JwtSecurityTokenHandler();
// Describe the token used by the user to log in
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new Claim[]
{
new Claim(JwtRegisteredClaimNames.Sub, formdata.Username),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
new Claim(ClaimTypes.NameIdentifier, user.Id),
new Claim(ClaimTypes.Role, roles.FirstOrDefault()),
new Claim("LoggedOn", DateTime.Now.ToString()),
}),
SigningCredentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256Signature),
Issuer = _appSettings.Site,
Audience = _appSettings.Audience,
Expires = DateTime.UtcNow.AddMinutes(tokenExpiryTime)
};
// Generate the token
var token = tokenhandler.CreateToken(tokenDescriptor);
return Ok(new {token= tokenhandler.WriteToken(token), expiration = token.ValidTo,username = user.UserName,userRole = roles.FirstOrDefault()});
}
// Return error
ModelState.AddModelError("","Username/Password was not Found");
return Unauthorized(new { LoginError = "Please check the Login Credentials - Invalid Username/Password was entered" });
}
}
}
和 LoginViewModel
public class LoginViewModel
{
[Required]
[Display(Name = "User Name")]
public string Username { get; set; }
[Required]
[DataType(DataType.Password)]
public string Password { get; set; }
}
问题在于 > var tokenDescriptor = new SecurityTokenDescriptor 根据输出中提到的代码中的第 101 行。但是,我无法弄清楚为什么会出现错误。
解决方案
所以就像 Claim 有一个空参数。为此,您发现了这个问题。
如下更新您的代码:-
.....
Subject = new ClaimsIdentity(new Claim[]
{
new Claim(JwtRegisteredClaimNames.NameId,formdata.UserName), //modified
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
new Claim(JwtRegisteredClaimNames.Sub, user.Id.ToString()), //modified
new Claim(ClaimTypes.Role, roles.FirstOrDefault()),
new Claim("LoggedOn", DateTime.Now.ToString()),
}),
.....
希望它能解决您的问题。
推荐阅读
- python - 无法使用 BeautifulSoup 获取 youtube 视频网址
- angular - Angular 11:将 URL 动态添加到 Iframe 但它给出了错误
- java - 在Processing(java)中使用鼠标坐标绘制箭头
- node.js - 在 Vercel 上部署的 Nextjs 中的 api 请求出现 504/502 错误
- javascript - TypeError 的解决方案:Cannot read property 'prototype' of undefined in React App
- angular - 角度数据表数据未从 API 正确绑定
- python - 在pygame python的第二个和第三个立方体上插入其他图像
- python - 保存现有的 docx 文档不会更改文件名
- python - Django过滤器如何在其他条件下返回查询集
- javascript - 如何在单击来自电子邮件中继(获取并提交)链接中的代码的链接时导航到特定屏幕?