怎么都无法解决的 "Cannot Generate SSPI Context"
现象:
前台的Web数据库无法使用域账号登陆了.
报的错误Cannot generate SSPI context. (.Net SqlClient Data Provider) .
在服务器的Windows日志中,找不到任何关于SQL Server的这个错误.
在本机使用域账号可以登陆进去.
处理过程:
查阅大量的关于这个错误的文章:
首先,是关于kerberos NTLM的工作原理,以及SQL Server关于SSO的应用原理
http://blogs.msdn.com/b/sql_protocols/archive/2005/10/12/479871.aspx
从上面的文章中得知.
要在Windows的域中使用Kerberos需要有相关的SPN设置(可以通过SETSPN.EXE来查询)
PS C:\Windows\system32> setspn -q mssqlsvc/qa-webdb.xxxxxx.cn:1433
Checking domain DC=xxxxxx,DC=cn
CN=QA-WEBDB,OU=auto logoff,OU=Servers,OU=xxxxxxUsers,DC=xxxxxx,DC=cn
MSSQLSvc/qa-webdb.xxxxxx.cn:1433
MSSQLSvc/qa-webdb.xxxxxx.cn
WSMAN/qa-webdb.xxxxxx.cn
TERMSRV/qa-webdb.xxxxxx.cn
RestrictedKrbHost/qa-webdb.xxxxxx.cn
HOST/qa-webdb.xxxxxx.cn
WSMAN/QA-WEBDB
TERMSRV/QA-WEBDB
RestrictedKrbHost/QA-WEBDB
HOST/QA-WEBDB
如上所示,SPN在这台服务器上是存在的.
那奇怪了,依然还是报相同的错误.
通过以下文章:
http://blogs.msdn.com/b/sql_protocols/archive/2005/10/15/481297.aspx
得知,当MSSQLServer服务在未正常结束后,马上又改用别的账号设置logon as,将会出现这样的问题.
因为SPN会被注册两个.
我们知道一个域内,一台服务器的SPN有且只能有一个.如果出现多个,将无法正常的使用.
就是这个原因了.
于是有了以下的解决办法:
将mssqlserver服务的logon改用localsystem的builtin账号登陆.
试一下,可否使用域账号登陆.
OK了.搞定.
接下来的事情就是再把logon设置成以前使用的账号.
因为这台实例上配置了MDW的统一管理,需要使用域账号将相关的监控信息写到db-center中.需要使用相同的域账号.要再设置回去.