怎么都无法解决的 "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/2006/12/02/understanding-kerberos-and-ntlm-authentication-in-sql-server-connections.aspx

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中.需要使用相同的域账号.要再设置回去.

 

posted @ 2012-09-21 09:16  老玉米  阅读(2450)  评论(0编辑  收藏  举报