Dotnet 5项目Docker环境下Windows认证出现Gss Failure报错如何解决
.NET 5 Windows Authentication Docker 环境异常解决方案
问题说明
开发.NET 5项目的Windows Authentication功能时,本地Windows环境运行正常,部署到Docker环境后无法通过认证,现有公开解决方案均适配.NET Core 3.1,不兼容.NET 5版本。
解决步骤
1. 修复GSSAPI不支持机制报错
该报错是因为生成keytab时使用的RC4-HMAC加密算法已被多数企业域环境和.NET 5 Negotiate组件默认禁用,按以下步骤调整:
- 优先使用AES系列加密算法重新生成keytab,执行命令:
ktutil ktutil: add_entry -password -p myUserName@MY.COMPANY.LOCAL -k 1 -e aes256-cts-hmac-sha1-96 ktutil: add_entry -password -p myUserName@MY.COMPANY.LOCAL -k 1 -e aes128-cts-hmac-sha1-96 # 按提示输入对应用户的域账号密码 ktutil: write_kt /etc/krb5.keytab ktutil: exit
- 在krb5.conf的
[libdefaults]节点添加加密类型兼容配置:
[libdefaults] default_realm = MY.COMPANY.LOCAL default_tkt_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 rc4-hmac default_tgs_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 rc4-hmac permitted_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 rc4-hmac dns_lookup_kdc = true dns_lookup_realm = true
- 删除启动脚本中手动执行kinit的逻辑,Negotiate组件会自动从/etc/krb5.keytab读取认证信息,手动生成的票据会出现权限不匹配问题,修改后的run.sh内容:
dotnet MyApi.dll
2. SPN参数填写说明
官方文档中setspn -S HTTP/myservername.mydomain.com myuser命令里的myservername.mydomain.com是外部用户访问你API服务时使用的完整域名/主机名:
- 如果你对外暴露的服务地址是
http://myapi.company.local,就填写myapi.company.local - 如果用户直接通过IP地址访问服务,就填写对应的IP地址
- 该命令需要域管理员权限执行,执行完成后需等待域内同步生效,通常不超过15分钟。
3. 基础环境检查
- 确认你的Docker运行时基础镜像已安装Kerberos和GSS相关依赖:
- Debian/Ubuntu系镜像执行安装命令:
apt install -y gss-ntlmssp krb5-user libgssapi-krb5-2 - RHEL/CentOS系镜像执行安装命令:
yum install -y krb5-workstation gssntlmssp
- Debian/Ubuntu系镜像执行安装命令:
- 确认运行Docker容器的宿主机DNS配置指向公司域控服务器,容器可正常解析域控地址。
- 确认你项目中已开启Authentication中间件,
Configure方法中存在app.UseAuthentication()代码,且顺序在app.UseAuthorization()之前。
内容的提问来源于stack exchange,提问作者Mozartos
相关产品推荐
相关产品推荐

