问题描述
我为客户端创建了WinForms应用程序,该应用程序使用集成的安全性连接到sql Server。客户抱怨说他们得到了错误-“无法生成sspI上下文”。事实证明,他们试图通过不属于域的计算机上的VPN连接到WinForms应用程序。如果将连接字符串更改为使用sql用户,则该程序可以运行,但是会丢失从Windows身份获取的信息。我的问题是,我是否能够使此设置正确运行,还是需要找到其他方法使该程序通过VPN运行。谢谢。
韦德
解决方法
正如您所说,计算机不属于AD域。 If your computer is not part of a domain,local user accounts are the only accounts you can use to log on.(登录到本地系统)。并且您无权使用具有这些本地凭据的域的资源。当您的计算机是域的一部分时,您既可以使用域帐户登录,也可以使用本地用户帐户登录。因此,VPN不太可能出现此问题:通常可以通过配置VPN的方式,使客户端成为远程子网的一部分。 "user sitting at a computer in the subsidiary office can access the servers at the headquarters as if he were there,thanks to an OpenVPN tunnel connection between the two networks." 假设已按上述配置网络-将计算机添加到AD域时,您将能够使用集成的SQL Server身份验证方法进行身份验证。否则,只有SQL Server身份验证可用。如果客户端计算机是另一个域的一部分,则管理员可以配置两个域之间的“信任关系”。 在这里讨论此问题:Connect to domain SQL Server 2005 from non-domain machine
如果客户端属于一个AD域,并且SQL Server实例使用来自另一个域的帐户运行,那么(我认为),最安全的解决方案是在域之间建立信任关系-如此处所述,可以从另一个域对用户进行大访问"Cross Domain SQL Server Logins Using Windows Authentication"
将客户端计算机添加到域或建立信任关系是简单的解决方案。但是有时解决票证需要大型(跨国)公司的太多批准。如果客户端计算机的用户使用来自其他域的帐户(或使用本地帐户)登录到其计算机,则您仍然可以使用假冒解决方案-客户端进程应使用来自以下位置的帐户进行身份验证/连接到SQL Server SQL Server的域。查找详细信息:How do you do Impersonation in .NET?
例如,假设使用来自Domain S的帐户登录SQL Server,并且仅向 用户授予Grands权限。但是由于某些原因,客户端无法使用来自Domain S的帐户登录本地操作系统然后使用来自域C的帐户登录到OS(也许客户端主要使用来自域C的资源)。然后,WinForms进程具有来自域C的用户帐户的安全上下文。该过程应模拟自身并将安全上下文从域S切换到用户,然后使用集成身份验证连接到SQL Server。