我想使用集成身份验证从Web部件访问SQL数据库。它应该使用IIS应用程序池标识。
默认情况下,您将收到错误消息:
System.Data.SqlClient.SqlException: Login failed for user 'SERVER\IUSR_VIRTUALMACHINE'.
因为在web.config中,模拟设置为true:
<identity impersonate="true" />
我可以将其设置为false,数据库代码也可以。匿名访问的网站也可以使用。任何使用身份验证的SharePoint站点都将失败,因此这不是真正的解决方案..
要解决此问题,我必须封装所有数据库访问代码以使用提升的权限运行,SharePoint是如何在内部执行的?不知何故,这似乎不是最高性能的解决方案。 这仍然是要走的路,只需使用SQL安全性从SharePoint自定义Web部件访问数据库吗?
答案 0 :(得分:4)
web.config文件中的<identity />
和<authentication />
元素将共同确定使用集成身份验证时用于连接到SQL Server的帐户。
配置<authentication mode="Windows" />
后,您将推迟到IIS对用户进行身份验证。我猜你的web.config包含:
<authentication mode="Windows" />
<identity impersonate="true" />
并且IIS配置为允许匿名用户。设置<identity impersonate="true" />
会导致IIS将IIS匿名访问帐户的标识传递给SQL Server。
正如Lars指出的那样,使用SPSecurity.RunWithElevatedPrivileges将实现您想要的效果。我不相信你会看到对性能有任何明显的影响,但这是你可以测试的东西: - )
答案 1 :(得分:3)
使用SPSecurity.RunWithElevatedPrivileges在应用程序池标识的上下文中运行代码。
答案 2 :(得分:0)
这是不正确的。由于<identity impersonate="true" />
设置为true,因此ASP.NET / IIS将以当前登录的用户身份运行该线程(因此不是应用程序池帐户,而是登录到网站的实际用户)。
此处还有其他事情发生。你可以发布自定义数据库的连接字符串吗? (减去私人数据)