You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker部署SQL Server时C# Web API登录失败求助(错误18456)

解决Docker中SQL Server登录失败(Error 18456, State 1)的步骤

1. 确认SQL Server容器的认证配置

启动SQL Server容器时必须显式开启SQL Server认证,并确保密码符合复杂度要求。检查你的容器启动命令是否包含必要参数:

docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=YourStrong!Passw0rd" -p 1433:1433 --name sqlserver-container -d mcr.microsoft.com/mssql/server:2019-latest
  • 若使用自定义用户nostalgic_bohr,需确认该用户已在SQL Server实例中创建,密码正确,且拥有目标数据库的访问权限。

2. 修正连接字符串

容器化场景下的连接字符串必须避开Windows认证,同时适配容器网络:

  • 移除Trusted_Connection=True,禁用Windows认证
  • 若API与SQL Server在同一Docker网络,用容器名称作为服务器地址(如sqlserver-container,1433);外部访问则用localhost,1433或主机IP
  • 添加Trust Server Certificate=true跳过容器内证书验证
  • .NET Core 3.0+可显式指定Authentication=SqlPassword

正确示例:

"Server=sqlserver-container,1433;Database=YourDB;User Id=nostalgic_bohr;Password=YourUserPassword;Trust Server Certificate=true;Authentication=SqlPassword"

3. 验证容器网络连通性

如果API和SQL Server是独立容器,必须确保它们在同一Docker网络:

  1. 创建自定义网络:docker network create app-network
  2. 启动SQL Server容器时加入网络:docker run ... --network app-network ...
  3. 启动API容器时加入同一网络:docker run ... --network app-network ...

可在API容器内测试连通性:

telnet sqlserver-container 1433
# 或用nc工具
nc -zv sqlserver-container 1433

4. 查看SQL Server日志定位具体原因

进入SQL Server容器提取错误日志,获取更精确的错误状态码(State值比State1更具指向性):

docker exec -it sqlserver-container cat /var/opt/mssql/log/errorlog | grep "Login failed"

常见State值对应问题:

  • State2/5:用户名不存在或密码错误
  • State6:误用Windows认证方式登录SQL Server账号
  • State8:密码错误
  • State11/12:用户存在但无登录权限或被禁用

5. 完成数据库用户权限映射

确保nostalgic_bohr登录账号已映射到目标数据库,并拥有CRUD权限,在SSMS中执行:

USE YourDB;
CREATE USER nostalgic_bohr FOR LOGIN nostalgic_bohr;
ALTER ROLE db_datareader ADD MEMBER nostalgic_bohr;
ALTER ROLE db_datawriter ADD MEMBER nostalgic_bohr;

内容的提问来源于stack exchange,提问作者Deck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 07:11:05