Аутентификация 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. Переключите версию пакетов на последнюю стабильную версию, и она будет работать как положено.