2

在我之前的问题中,我询问如何在我的应用程序中使用 Windows 身份验证。现在正在工作,用户可以使用该帐户登录,但我有一个数据库访问方案,我找不到任何东西。

基本上我会有几台服务器,这就是问题所在。

在某些服务器上,他们将拥有用于 SQL Server 数据库服务器的 Windows 身份验证帐户,因此应使用模拟他们的凭据。但我注意到它是 web.config 中的一个全局设置(不是每个连接),在一种情况下,我想使用应用程序(IIS 或 ASP)Windows 身份验证帐户而不是用户。(访问我的配置数据库)

我怎么能做到这一点?

Web 应用程序是托管在 Server 2003/2008 IIS 6/7/7.5 上的 ASP.NET MVC,客户端为 Windows XP 及更高版本。使用 SQL Server Express/Standard 2005/2008 混合。

4

3 回答 3

6

模拟是在整个站点范围内进行的,或者您可以手动将其打开。恐怕你不能手动关闭它,也不能通过连接字符串来完成。

所以基本上关闭模拟,然后在需要模拟时包装数据库调用,如下所示:

using System.Security.Principal;

WindowsIdentity winId = (WindowsIdentity)HttpContext.Current.User.Identity;
WindowsImpersonationContext ctx = null;
try
{
    ctx = winId.Impersonate();
    // Do your thing
}
catch
{
}
finally
{
    if (ctx != null)
        ctx.Undo();
}

MSDN P&P guide to asp.net impersonation有更多内容。

于 2009-09-11T14:11:46.087 回答
2

您必须在网络上设置委托,以便 ASP.NET 服务器可以模拟 Sql 服务器计算机上的用户。这假设您的服务器位于 Active Directory 控制的网络(而不是工作组)上,并且 sql 服务器与您的 Web 服务器位于不同的机器上。

您将为您希望模拟用户的那些数据库服务器计算机配置委派,而不为您希望 ASP.NET 工作进程帐户作为访问服务器的帐户的那些服务器计算机配置它。

如果你不能这样做,你可以在你希望阻止委托的 Sql Server 实例上关闭 windows/混合身份验证,然后在 web.config 中的连接字符串中手动配置要连接的 Sql Server 帐户。

于 2009-09-11T14:11:57.960 回答
0

使用域控制器 - 因此它可以在整个域中为单个用户传播相同的凭据。

工作组的第二个技巧 - 在两台服务器(ASP 和 SQLServer)上创建相同的模拟帐户(使用完全相同的登录名和密码)。不要忘记在 SQLServer 上授予此权限。

于 2009-09-11T14:03:10.603 回答