c# - MissingFieldException:找不到字段:'Microsoft.Net.Http.Headers.HeaderNames.Authorization'
问题描述
我使用.NET Core 3.0 Preview 4 CLI制作了一个 API 。我已经到了可以发送用户名和密码并获取令牌(JWT)的地步。
这是我的登录方法。
[HttpPost("login")]
public async Task<IActionResult> Login([FromBody] UserForLoginDto userForRegisterDto)
{
var userFromRepo = await _repo.Login(userForRegisterDto.Username.ToLower(), userForRegisterDto.Password);
if (userFromRepo == null) //User login failed
return Unauthorized();
//generate token
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.ASCII.GetBytes(_config.GetSection("AppSettings:Token").Value);
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new Claim[]{
new Claim(ClaimTypes.NameIdentifier,userFromRepo.Id.ToString()),
new Claim(ClaimTypes.Name, userFromRepo.Username)
}),
Expires = DateTime.Now.AddDays(1),
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha512Signature)
};
var token = tokenHandler.CreateToken(tokenDescriptor);
var tokenString = tokenHandler.WriteToken(token);
return Ok(new { tokenString });
}
此方法工作正常并为我提供令牌,但我想使用属性限制对方法或控制器的访问[Authorize]
,我得到以下异常。
MissingFieldException: Field not found: 'Microsoft.Net.Http.Headers.HeaderNames.Authorization'.
Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync()
System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start<TStateMachine>(ref TStateMachine stateMachine)
Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync()
Microsoft.AspNetCore.Authentication.AuthenticationHandler<TOptions>.AuthenticateAsync()
Microsoft.AspNetCore.Authentication.AuthenticationService.AuthenticateAsync(HttpContext context, string scheme)
Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.Invoke(HttpContext httpContext)
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
我在ConfigureServices
方法中配置了身份验证中间件,如下所示。
public void ConfigureServices(IServiceCollection services)
{
services.AddCors();
services.AddDbContext<DataContext>(x => x.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddControllers()
.AddNewtonsoftJson();
services.AddScoped<IAuthRepository, AuthRepository>();
var key = Encoding.ASCII.GetBytes(Configuration.GetSection("AppSettings:Token").Value);
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options => {
options.TokenValidationParameters = new TokenValidationParameters{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidateIssuer = false,
ValidateAudience = false
};
});
}
并已添加app.UseAuthentication();
到Configure
方法中。
app.UseCors(x => x.AllowAnyHeader().AllowAnyMethod().AllowCredentials());
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
我拼命地尝试安装以下软件包,但运气为 0。
dotnet 添加包 Microsoft.Net.Http.Headers --version 2.2.0
dotnet 添加包 Microsoft.AspNetCore.StaticFiles --version 2.2.0
我不知道出了什么问题。此代码用于 .NET Core 2.2
我文件中的相关部分csproj
如下所示..
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="3.0.0-preview5-19227-01" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.0.0-preview4-19216-03" />
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="2.2.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.0.0-preview4.19216.3">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.0.0-preview4.19216.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.3" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="5.4.0" />
</ItemGroup>
解决方案
要解决此问题,请尝试将Microsoft.AspNetCore.Authentication.JwtBearer
版本更改为3.0.0-preview5-19216-09
.
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="3.0.0-preview5-19216-09" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.0.0-preview4-19216-03" />
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="2.2.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.0.0-preview4.19216.3">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.0.0-preview4.19216.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.3" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="5.4.0" />
</ItemGroup>
推荐阅读
- javascript - 通过单击按钮打开模式并通过单击关闭按钮隐藏模式
- html - CSS 悬停过渡
- java - __builtin_clz 的 Java 等价物是什么?
- aws-cdk - aws cdk 使用非默认配置文件
- python - 什么是 django.db.utils.OperationalError: (2000, 'Unknown MySQL error')
- kubernetes - Kubernetes 并行计算
- javascript - Javascript:解析每个 CSV 列以分隔 JSON
- php - Array_intersect 和返回值的顺序
- java - Spring安全认证服务器
- c - 为什么可以在 C 中的循环内定义变量?