IIS 上的 JWT 身份验证 returns 401 错误
JWT Authentication returns 401 error on IIS
我有一个使用 JWT 身份验证的 ASP.NET Core 3.1 API,API 旨在将资源发送到 Angular 项目。
某些方法受用户登录身份验证的保护。这适用于 Visual Studio 调试。但是在 IIS 上,即使 api returns 是正确的登录令牌,我在这些方法中的任何一个上都只会收到 401 错误。
我不知道自己做错了什么,实际上我现在不知道自己在做什么。非常感谢任何有关 API 和 IIS 的帮助。
StartUp.cs
services.AddAuthentication(opt =>
{
opt.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
opt.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = "https://localhost:8080",
ValidAudience = "https://localhost:8080",
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("mySecretKey"))
};
});
appSettings.json
"iisSettings": {
"windowsAuthentication": true,
"anonymousAuthentication": false
}
UserController.cs
[HttpPost("login")]
public IActionResult Login([FromBody]User input)
{
if (input == null)
{
return BadRequest("Invalid client request");
}
var user = _context.Users.FirstOrDefault(ol => ol.Email == input.Email && ol.Password == input.Password);
if (user != null)
{
var secretKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("mySecretKey"));
var signingCredentials = new SigningCredentials(secretKey, SecurityAlgorithms.HmacSha256);
var claims = new List<Claim>
{
new Claim(ClaimTypes.Email, user.Email),
new Claim(ClaimTypes.Role, user.Admin ? "Admin" : "NormalUser")
};
var tokenOptions = new JwtSecurityToken(
issuer: "https://localhost:8080",
audience: "https://localhost:8080",
claims: claims,
expires: DateTime.Now.AddHours(2),
signingCredentials: signingCredentials
);
var tokenString = new JwtSecurityTokenHandler().WriteToken(tokenOptions);
return Ok(new { Token = tokenString });
}
else
{
return Ok(new { Token = "Unauthorized" });
}
}
其他控制器示例方法
[Authorize(Roles = "Admin")]
[HttpGet]
public IActionResult Get()
{
try
{
doStuff();
}
catch (Exception e)
{
return BadRequest(e);
}
return Ok();
}
我的朋友发现了我的问题!该令牌从未添加到请求的身份验证 header 中。我所做的只是使用 HTTP 拦截器将令牌添加到每个请求。真正的问题是它在没有拦截器的情况下如何进行调试?
我想我们可以从中学到的是在 运行 Whosebug 之前先检查您的 header。
我在 this question 上使用了 Martin Adámek 的回答。
我有一个使用 JWT 身份验证的 ASP.NET Core 3.1 API,API 旨在将资源发送到 Angular 项目。 某些方法受用户登录身份验证的保护。这适用于 Visual Studio 调试。但是在 IIS 上,即使 api returns 是正确的登录令牌,我在这些方法中的任何一个上都只会收到 401 错误。
我不知道自己做错了什么,实际上我现在不知道自己在做什么。非常感谢任何有关 API 和 IIS 的帮助。
StartUp.cs
services.AddAuthentication(opt =>
{
opt.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
opt.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = "https://localhost:8080",
ValidAudience = "https://localhost:8080",
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("mySecretKey"))
};
});
appSettings.json
"iisSettings": {
"windowsAuthentication": true,
"anonymousAuthentication": false
}
UserController.cs
[HttpPost("login")]
public IActionResult Login([FromBody]User input)
{
if (input == null)
{
return BadRequest("Invalid client request");
}
var user = _context.Users.FirstOrDefault(ol => ol.Email == input.Email && ol.Password == input.Password);
if (user != null)
{
var secretKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("mySecretKey"));
var signingCredentials = new SigningCredentials(secretKey, SecurityAlgorithms.HmacSha256);
var claims = new List<Claim>
{
new Claim(ClaimTypes.Email, user.Email),
new Claim(ClaimTypes.Role, user.Admin ? "Admin" : "NormalUser")
};
var tokenOptions = new JwtSecurityToken(
issuer: "https://localhost:8080",
audience: "https://localhost:8080",
claims: claims,
expires: DateTime.Now.AddHours(2),
signingCredentials: signingCredentials
);
var tokenString = new JwtSecurityTokenHandler().WriteToken(tokenOptions);
return Ok(new { Token = tokenString });
}
else
{
return Ok(new { Token = "Unauthorized" });
}
}
其他控制器示例方法
[Authorize(Roles = "Admin")]
[HttpGet]
public IActionResult Get()
{
try
{
doStuff();
}
catch (Exception e)
{
return BadRequest(e);
}
return Ok();
}
我的朋友发现了我的问题!该令牌从未添加到请求的身份验证 header 中。我所做的只是使用 HTTP 拦截器将令牌添加到每个请求。真正的问题是它在没有拦截器的情况下如何进行调试?
我想我们可以从中学到的是在 运行 Whosebug 之前先检查您的 header。
我在 this question 上使用了 Martin Adámek 的回答。