ASP.NET Core 5.0 Linux Docker配置Windows身份验证遇GssApiException错误
我正尝试按照相关回答的步骤,搭建一个运行在Docker上、支持Windows身份验证的ASP.NET Core Web应用。
项目信息
- ASP.NET Core Web 应用
- 基于 .NET 5.0 框架
- 支持 Windows 身份验证
- 适配 Linux 环境的 Docker 支持
- 于 Windows 10 系统上使用 Visual Studio 2019 社区版(版本号16.10.2)创建
操作步骤
- 新增HomeController及对应视图
- 安装
Microsoft.AspNetCore.Authentication.Negotiate包 - 在
ConfigureServices方法中添加代码:services.AddAuthentication(NegotiateDefaults.AuthenticationScheme).AddNegotiate(); - 在
Configure方法中添加代码:app.UseAuthentication();
Docker调试模式运行表现
初始无需输入凭据即可进入应用,且User.Identity.Name返回null。在Home控制器上添加Microsoft.AspNetCore.Authorization.AuthorizeAttribute特性后,会触发凭据输入框,但输入凭据后出现如下报错:
GssApiException: GSSAPI operation failed with error - Unspecified GSS failure. Minor code may provide more information (Keytab FILE:/etc/krb5.keytab is nonexistent or empty).
Microsoft.AspNetCore.Authentication.Negotiate.NegotiateHandler.HandleRequestAsync()
Microsoft.AspNetCore.Authentication.Negotiate.NegotiateHandler.HandleRequestAsync()
Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
目前不清楚问题原因,也不确定当前实现思路是否正确,希望能得到相关解决指导,以下是项目相关文件代码:
Startup.cs
using Microsoft.AspNetCore.Authentication.Negotiate; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; namespace DockerTest { public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { services.AddRazorPages(); services.AddAuthentication(NegotiateDefaults.AuthenticationScheme).AddNegotiate(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseDeveloperExceptionPage(); // 为节省篇幅移除了其他分支代码 app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); } } }
Program.cs
using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Hosting; namespace DockerTest { public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }); } }
HomeController.cs
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace DockerTest.Controllers { [Route("[controller]")] [Authorize] public class HomeController : Controller { [Route("/")] [Route("/Home")] [Route("/Home/Index")] public IActionResult Index() { return View(); } } }
Dockerfile(Visual Studio自动生成)
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging. FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base WORKDIR /app EXPOSE 80 EXPOSE 443 FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build WORKDIR /src COPY ["DockerTest/DockerTest.csproj", "DockerTest/"] RUN dotnet restore "DockerTest/DockerTest.csproj" COPY . . WORKDIR "/src/DockerTest" RUN dotnet build "DockerTest.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "DockerTest.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "DockerTest.dll"]
内容的提问来源于stack exchange,提问作者nick zoum

