MissingFieldException: поле не найдено: 'Microsoft.Net.Http.Headers.HeaderNames.Authorization' - PullRequest
1 голос
/ 09 мая 2019

Я делаю API с .NET Core 3.0 Preview 4 CLI . Я дошел до того, что вы можете отправить имя пользователя и пароль и получить токен (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)

Я отправляю запрос только с заголовком Authorization. enter image description here

Я настроил промежуточное ПО аутентификации в методе 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 - версия 2.2.0

dotnet добавить пакет Microsoft.AspNetCore.StaticFiles - версия 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>

Ответы [ 2 ]

0 голосов
/ 19 мая 2019

У меня возникла эта проблема, когда мое установленное ядро ​​.net sdk / runtime находилось в предварительном просмотре 4, а не в предварительном просмотре 5, хотя ссылки на пакеты nuget были последними.

Легко сделать, когда вы обновляетеnuget, но не устанавливайте последнюю версию.

Это объясняет, почему у меня не было проблем с linux / docker, который использовал ночную сборку времени выполнения.

Mike

0 голосов
/ 10 мая 2019

Для решения этой проблемы попробуйте изменить 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>
...