asp.net - ASP.NET 核心 JWT 身份验证总是抛出 401 未授权
问题描述
我正在尝试尽可能简单地在我的 asp.net 核心 webAPI 上实现 JWT 身份验证。我不知道我错过了什么,但即使使用正确的不记名令牌,它也总是返回 401。
这是我的 configureServices 代码
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(x =>
{
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(
x =>
{
x.RequireHttpsMetadata = false;
x.SaveToken = true;
x.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes("A_VERY_SECRET_SECURITY_KEY_FOR_JWT_AUTH")),
ValidateAudience = false,
ValidateIssuer = false,
};
}
);
services.AddControllers();
services.AddDbContext<dingdogdbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("dingdogdbContext")));
}
这就是我生成令牌的方式
[AllowAnonymous]
[HttpPost("/Login")]
public ActionResult<User> Login(AuthModel auth)
{
var user = new User();
user.Email = auth.Email;
user.Password = auth.Password;
//var user = await _context.User.SingleOrDefaultAsync(u=> u.Email == auth.Email && u.Password==auth.Password);
//if(user==null) return NotFound("User not found with this creds");
//starting token generation...
var tokenHandler = new JwtSecurityTokenHandler();
var seckey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes("A_VERY_SECRET_SECURITY_KEY_FOR_JWT_AUTH"));
var signingCreds = new SigningCredentials(seckey, SecurityAlgorithms.HmacSha256Signature);
var token = tokenHandler.CreateToken(new SecurityTokenDescriptor
{
Subject = new System.Security.Claims.ClaimsIdentity(new Claim[] { new Claim(ClaimTypes.Name, user.Id.ToString()) }),
SigningCredentials = signingCreds,
Expires = DateTime.UtcNow.AddDays(7),
});
user.Token = tokenHandler.WriteToken(token);
return user;
}
我在 app.useRouting() 之后添加了 app.useAuthorization()。当我向 /Login 发送 POST 请求时,我得到了令牌。但是当我使用令牌查询使用邮递员的任何其他端点时(在邮递员的授权/JWT 中添加令牌)每次都获得 401 未经授权。我还缺少什么吗?
解决方案
请记住UseAuthentication
,UseRouting
和UseAuthorization
中间件必须正确,以便 ASP 框架正确地将身份上下文注入 http 请求。
它应该如下所示:(.NET Core 3.1)
编辑:相同的代码适用于 .NET 5 & .NET 6
app.UseAuthentication();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
推荐阅读
- wsl-2 - 将 ECONNREFUSED 连接到 WSL2 ubuntu-18.04
- reactjs - 即使替换数据后组件状态也不会改变
- sql - 日期、小时和分钟的 Where 子句
- regex - 正则表达式 | 从组中的另一个元素中窃取字符类
- html - Bootstrap 在断点处添加自定义 css
- typescript - 在一个类型中引用一个键两次
- javascript - 将两个 snap svg 组组合成一个组
- sql - SQL to pandas JOIN w/AND 问题
- php - 将 json 数组转换为 php 数组
- visual-studio - HoloLens 错误:“出现部署错误。继续吗?”