我正在开发一个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”用户的身份验证失败。
我们可以在失败后重新验证当前身份仍然是我们想要的帐户而不是ANONYMOUS LOGIN帐户。
有谁知道为什么会这样?或者更具体地说,我们如何解决它?
修改 有关这些页面的调用如何工作的一些其他信息。
我们从.aspx页面进行模拟调用。
在我们冒充之后,我们召集了一个被引用的“业务逻辑”程序集。
我们知道上下文标识在这里仍然是正确的。
之后,“业务逻辑”程序集调用另一个实际执行可信连接调用的程序集。我们无法修改此“数据访问”程序集,此程序集也会报告身份验证异常。
答案 0 :(得分:3)
我认为@John Sonmez是对的,你正在打双跳问题。模拟只是故事的一半,您还需要查看委托(假设您的网络正在使用Kerberos身份验证)。以下文章对帮助我完成同样的问题最有用
答案 1 :(得分:0)
我知道我之前在ASP.NET中使用过模拟(使用C#并访问文件系统),我想知道你是否尝试过包含 currentWindowsIdentity.Impersonate()的逻辑'使用/结束使用'(显式定义代码块的安全上下文)。
所以,它看起来像这样:
Using impersonationContext = currentWindowsIdentity.Impersonate()
' Logic here
End Using