我在 dotnet 5 项目中的 Windows 身份验证方面苦苦挣扎了几天,但无法让它在 Docker 环境中工作。在Windows系统本地运行时,可以正常运行。我发现了其他主题,可能是重复的,但它们与 .net core 3.1 相关,而不是 dotnet 5。
让我解释一下,到目前为止我做了什么。首先在 dotnet 项目中:
services.AddAuthentication(NegotiateDefaults.AuthenticationScheme).AddNegotiate();
[Authorize]
属性的附加简单控制器,它当然可以在 Docker 中正常工作。实际上没有任何意义,但这只是让我确信它正在起作用。除了 dotnet 代码
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
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。您能指导一下我该怎么做吗?
“请求了不受支持的机制。”可能是由于缺少包裹。尝试将其添加到您的 Dockerfile 中:
RUN apt-get update && apt-get install -y gss-ntlmssp