首页 > 解决方案 > 值不能为空。(参数“值”)

问题描述

我创建了一种方法,用户可以登录到我的应用程序,然后将令牌发送给用户,以便它可以用于查看应用程序中的任何其他视图。当我在邮递员上测试登录方法时,我得到 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 行。但是,我无法弄清楚为什么会出现错误。

标签: c#.netasp.net-mvcasp.net-core

解决方案


所以就像 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()),

                    
                }),

.....

希望它能解决您的问题。


推荐阅读