0

我正在处理一个 ASP.NET 页面,我们在代码中模拟了请求用户。我们正在使用以下代码开始模拟。

Dim impersonationContext As System.Security.Principal.WindowsImpersonationContext
Dim currentWindowsIdentity As System.Security.Principal.WindowsIdentity
currentWindowsIdentity = CType(User.Identity, System.Security.Principal.WindowsIdentity)
impersonationContext = currentWindowsIdentity.Impersonate()

在此之后,我们通过调用验证了应用程序正在正确的上下文中运行:

System.Security.Principal.WindowsIdentity.GetCurrent().Name

这将返回用户的正确身份,并且文件访问和其他项目似乎正在使用他们的帐户。但是,当使用 Microsoft 应用程序数据应用程序块 SqlHelper 类调用使用受信任连接的数据库时,“NT AUTHORITY\ANONYMOUS LOGON”用户身份验证失败。

我们可以在失败后重新验证当前身份仍然是我们想要的帐户,而不是匿名登录帐户。

有谁知道这是为什么?或者更具体地说,我们如何绕过它?

编辑 有关来自这些页面的调用如何工作的一些附加信息。

我们从 .aspx 页面进行模拟调用。

在我们模拟之后,我们调用一个被引用的“业务逻辑”程序集。

我们知道上下文标识在这里仍然是正确的。

之后,“业务逻辑”程序集调用另一个实际执行可信连接调用的程序集。我们不能修改这个“数据访问”程序集,这个程序集也会报告身份验证异常。

4

2 回答 2

3

我认为@John Sonmez 是对的,您遇到了双跳问题。模拟只是故事的一半,您还需要查看委托(假设您的网络使用 Kerberos 身份验证)。下面的文章对帮助我解决同样的问题最有用

模仿和委托

ASP.NET 委托

于 2008-12-19T22:49:28.700 回答
0

我知道我之前在 ASP.NET 中使用过模拟(使用 C# 并访问文件系统),我想知道您是否尝试过将包含currentWindowsIdentity.Impersonate()的逻辑包装为“使用/结束使用”(明确定义代码块的安全上下文)。

所以,它看起来像这样:

Using impersonationContext = currentWindowsIdentity.Impersonate() 
' Logic here 
End Using
于 2008-12-19T22:30:43.357 回答