Аутентификация ASP.NET Core JWT не работает в контейнере Docker после миграции

Аутентификация ASP.NET Core JWT перестала работать после обновления веб-API ASP.NET Core с .NET Core 3.1 до .NET 8 (v8.0.100-preview.5.23303.2) при запуске в контейнере Docker.

Токен JWT, сгенерированный другой службой, к исходному коду которой у меня нет доступа, в то время как проект, над которым я работаю, должен проверять авторизацию с использованием указанного токена JWT.

Проект, над которым я работаю, был обновлен с помощью .NET Upgrade Assistant и отлично работает на моем компьютере с Windows, но не работает внутри контейнера Docker. Я попытался использовать JWTBearer 3.1.1 вместо предварительного просмотра, настроив Startup.cs (аналогичная проблема ), но API всегда возвращал «Invalid-Token», несмотря на то, что у меня был статус HTTP 200.

ЗдесьStartup.cs:

      using System.Net;
using System.Text;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.IdentityModel.Tokens;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using AppName.Models;

namespace AppName
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });
            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                .AddJwtBearer(options =>
                {
                    options.TokenValidationParameters = new TokenValidationParameters
                    {
                        ValidateIssuer = true,
                        ValidateAudience = true,
                        ValidateLifetime = true,
                        ValidateIssuerSigningKey = true,
                        ValidIssuer = new BaseUrls().getJwtIssuer(),
                        ValidAudience = new BaseUrls().getJwtAudience(),
                        IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(new BaseUrls().getJwtKey()))
                    };
                });
            services.AddControllersWithViews();
            services.AddMemoryCache();
            services
                .AddMvc(option => option.EnableEndpointRouting = false)
                .AddNewtonsoftJson(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver())
                .AddNewtonsoftJson(options => options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Local);
            services.AddSession();
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }

            app.UseStatusCodePages(async context => 
            {
                var request = context.HttpContext.Request;
                var response = context.HttpContext.Response;

                if (response.StatusCode == (int)HttpStatusCode.Unauthorized)
                {
                    response.Redirect("/account/login");
                }
            });

            app.UseAuthentication();
            app.UseAuthorization();
            app.UseCookiePolicy();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
        }
    }
}

Здесь.csproj:

      <Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <ServerGarbageCollection>false</ServerGarbageCollection>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="EFCore.BulkExtensions" Version="3.1.0" />
    <PackageReference Include="Microsoft.Extensions.Caching.Redis" Version="2.2.0" />
    <PackageReference Include="Microsoft.IdentityModel.Tokens" Version="6.31.0" />
    <PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="6.31.0" />
    <PackageReference Include="Flurl.Http" Version="2.4.1" />
    <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="3.1.1" />
    <PackageReference Include="Microsoft.AspNetCore.DataProtection" Version="8.0.0-preview.5.23302.2" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="8.0.0-preview.5.23302.2" />
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.0-preview.5.23280.1" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="8.0.0-preview.5.23280.1" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.0-preview.5.23280.1" />
    <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
  </ItemGroup>
</Project>

Докер-файл

      FROM mcr.microsoft.com/dotnet/aspnet:8.0.0-preview.5-jammy-amd64 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:8.0.100-preview.5-jammy-amd64 AS build
WORKDIR /src
COPY ["AppName/AppName.csproj", "AppName/"]
RUN dotnet restore "AppName/AppName.csproj"
COPY . .
RUN find -type d -name bin -prune -exec rm -rf {} \; && find -type d -name obj -prune -exec rm -rf {} \;
WORKDIR "/src/AppName"
RUN dotnet build "AppName.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "AppName.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "AppName.dll"]

1 ответ

Оказывается, мне не следует использовать предварительную версию пакетов nuget. Переключите версию пакетов на последнюю стабильную версию, и она будет работать как положено.

Другие вопросы по тегам