Gss 失败 - Docker 中的 Dotnet 5 和 Windows Auth

问题描述 投票:0回答:1

我在 dotnet 5 项目中的 Windows 身份验证方面苦苦挣扎了几天,但无法让它在 Docker 环境中工作。在Windows系统本地运行时,可以正常运行。我发现了其他主题,可能是重复的,但它们与 .net core 3.1 相关,而不是 dotnet 5。

在控制器中执行需要 Windows 身份验证的方法的结果:

我遵循了官方文档: https://learn.microsoft.com/en-us/aspnet/core/security/authentication/windowsauth?view=aspnetcore-5.0&tabs=visual-studio#kestrel

让我解释一下,到目前为止我做了什么。首先在 dotnet 项目中:

  • services.AddAuthentication(NegotiateDefaults.AuthenticationScheme).AddNegotiate();
  • 以防万一,我添加了一个没有
    [Authorize]
    属性的附加简单控制器,它当然可以在 Docker 中正常工作。实际上没有任何意义,但这只是让我确信它正在起作用。

除了 dotnet 代码

  • 我为我的公司域生成了 krb5.conf 文件并将其复制到 docker 映像中。它工作正常,因为我可以在 shell 中使用 kinit 并成功登录。不幸的是,我无法在这里分享这个文件。我在执行时看到有效的票证 klist

  • 使用 ktutil 生成 username.keytab 文件
ktutil 
ktutil: add_entry -password -p [email protected] -k 1 -e RC4-HMAC
# ktutil prompts for a password
ktutil: write_kt myUserName.keytab
ktuilt: exit
  • docker 文件
FROM company-custom-docker-image-with-dotnet-5 AS build
WORKDIR /app

COPY . ./
RUN dotnet publish -c Release -o out

FROM company-custom-docker-image-with-dotnet-runtime-5 
WORKDIR /app
COPY --from=build /app/out .
COPY krb5.conf /etc/krb5.conf
COPY username.keytab .
COPY run.sh .

ENTRYPOINT ["/app/run.sh"]

run.sh 很简单:

echo "Starting kinit"
kinit username -k -t username.keytab
dotnet MyApi.dll

在具有 [Authorize] 属性的控制器中运行方法后的错误是:

Interop+NetSecurityNative+GssApiException:GSSAPI 操作失败并出现错误 - 未指定的 GSS 故障。次要代码可能会提供更多信息(Keytab 文件:/etc/krb5.keytab 不存在或为空)。

重命名 myUserName.keytab 并移动到 /etc/krb5.keytab 后,我收到其他错误:

Interop+NetSecurityNative+GssApiException:GSSAPI 操作失败并出现错误 - 请求了不受支持的机制。

有件事我不明白,但我应该做。

Microsoft.AspNetCore.Authentication.Negotiate 组件执行用户模式身份验证。服务主体名称 (SPN) 必须添加到运行服务的用户帐户,而不是计算机帐户。在管理命令 shell 中执行 setspn -S HTTP/myservername.mydomain.com myuser。

我不知道我到底要输入什么作为myservername。您能指导一下我该怎么做吗?

docker .net-core kerberos windows-authentication
1个回答
0
投票

“请求了不受支持的机制。”可能是由于缺少包裹。尝试将其添加到您的 Dockerfile 中:

RUN apt-get update && apt-get install -y gss-ntlmssp
© www.soinside.com 2019 - 2024. All rights reserved.