2011-02-16 61 views
4

我们目前有一个winforms应用程序,允许用户登录以访问系统。认证系统是一个定制的kludge。我正在执行一项更改,将用户NT用户名和域名与他们现有的自定义帐户相关联,以便他们不需要重复登录。我使用WindowsIdentity.GetCurrent()。Name然后将该信息存储在数据库表,映射到他们的旧的accountid。我想知道的是,如果用户能够通过反映真实域名的计算机名称来访问网络,那么这是可能的吗?这可能会使恶意用户访问某人的帐户。我想真正的问题是:是否有办法区分SQL Server域和用户域,而不仅仅是对名称进行字符串比较。用户欺骗域名

+0

我可能完全不了解您的情况。这听起来像你正在使用SQL身份验证来访问数据库并将连接字符串存储在你的winapp中的某处。如果是这样的话,人们可能会从winapp窃取连接字符串并获得对数据库的访问权限。关于您的担忧,您可以考虑存储SID而不是用户名和域名。是的,这仍然没有保证,但至少这使得酒吧更高。网络上没有可用的工具来帮助您在域中伪造SID。我认为我们仍然可以做到这一点,但它应该是非常棘手的 – 2011-02-17 03:36:03

+0

谢谢哈维,这是我走的路。我现在使用用户名/域名信息存储令牌所有者ssid。这应该有效地解决某人设置自己的域名并使用VPN冒充另一个用户的问题。 – cdaq 2011-02-17 18:56:50

回答

2

是的,如果您的应用程序使用SQL身份验证来访问数据库,如果您将数据库连接更改为使用可信身份验证,则SQL Server将根据域控制器对登录进行身份验证。因此,尽管用户可以访问应用程序,但他们将无法访问驱动应用程序的数据库。如果你这样做了,你还可以将用户名的捕获移动到一个SQL Server存储过程,以确保捕获的名称与域名相匹配,而不是本地用户。

+0

我同意这是最佳方式,但这种改变将是巨大的,不会被管理部门批准。 – cdaq 2011-02-16 23:08:32

1

服务器不能信任客户。

如果客户端可以获取并使用凭据登录到数据库服务器,您就会烤面包。

如果您的服务器只是一个数据库服务器,并且您的应用程序不使用受信任的连接,并且您的应用程序不会提示输入数据库凭证,那么您将进行烘烤。 (见前面的声明)

我很懒。我将修补WindowsIdentity.GetCurrent()。如果我感觉喜欢它,则返回“Administrator”。