【发布时间】:2011-05-29 03:51:26
【问题描述】:
我想在代码中模拟特定用户,以便在远程机器上执行一些文件操作。我遇到的问题是我无法模拟工作。我正在使用此处找到的 Microsoft 文章中的代码:How to implement impersonation in an ASP.NET application
我想了解如何/从何处开始调试过程。这是我的文件:
Test.aspx:
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Test.aspx.vb" Inherits="TraceFile_Test" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
This is the test page!<br />
<br />
Result: <asp:Label ID="lblResult" runat="server"></asp:Label><br />
<br />
<asp:Button ID="btnRunTest" Text="Run Test" runat="server" />
</div>
</form>
</body>
</html>
Test.aspx.vb:
Imports System.Web
Imports System.Web.Security
Imports System.Security.Principal
Imports System.Runtime.InteropServices
Partial Class TraceFile_Test
Inherits System.Web.UI.Page
Dim LOGON32_LOGON_INTERACTIVE As Integer = 2
Dim LOGON32_PROVIDER_DEFAULT As Integer = 0
Dim impersonationContext As WindowsImpersonationContext
Declare Function LogonUserA Lib "advapi32.dll" (ByVal lpszUsername As String, _
ByVal lpszDomain As String, _
ByVal lpszPassword As String, _
ByVal dwLogonType As Integer, _
ByVal dwLogonProvider As Integer, _
ByRef phToken As IntPtr) As Integer
Declare Auto Function DuplicateToken Lib "advapi32.dll" ( _
ByVal ExistingTokenHandle As IntPtr, _
ByVal ImpersonationLevel As Integer, _
ByRef DuplicateTokenHandle As IntPtr) As Integer
Declare Auto Function RevertToSelf Lib "advapi32.dll" () As Long
Declare Auto Function CloseHandle Lib "kernel32.dll" (ByVal handle As IntPtr) As Long
Public Sub Page_Load(ByVal s As Object, ByVal e As EventArgs)
lblResult.Text = "Hit button to run test, please."
End Sub
Private Function impersonateValidUser(ByVal userName As String, _
ByVal domain As String, ByVal password As String) As Boolean
Dim tempWindowsIdentity As WindowsIdentity
Dim token As IntPtr = IntPtr.Zero
Dim tokenDuplicate As IntPtr = IntPtr.Zero
impersonateValidUser = False
If RevertToSelf() Then
If LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, token) <> 0 Then
If DuplicateToken(token, 2, tokenDuplicate) <> 0 Then
tempWindowsIdentity = New WindowsIdentity(tokenDuplicate)
impersonationContext = tempWindowsIdentity.Impersonate()
If Not impersonationContext Is Nothing Then
impersonateValidUser = True
End If
End If
End If
End If
If Not tokenDuplicate.Equals(IntPtr.Zero) Then
CloseHandle(tokenDuplicate)
End If
If Not token.Equals(IntPtr.Zero) Then
CloseHandle(token)
End If
End Function
Private Sub undoImpersonation()
impersonationContext.Undo()
End Sub
Protected Sub btnRunTest_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnRunTest.Click
If impersonateValidUser("myUserName", "myDomain", "myPassword") Then
'Insert your code that runs under the security context of a specific user here.
Trace.Write("impersonation successful!")
lblResult.Text = "success"
undoImpersonation()
Else
'Your impersonation failed. Therefore, include a fail-safe mechanism here.
Trace.Write("impersonation failed!")
lblResult.Text = "fail"
End If
End Sub
End Class
我用 myUserName、myDomain 和 myPassword 替换了帖子的真实凭据。
Web 服务器是运行 IIS 7 的 Windows 2008 服务器。我不是服务器专家,所以我不知道在哪里进行故障排除过程。是代码问题还是服务器端的问题?
与往常一样,提前感谢您抽出宝贵时间提供帮助!
【问题讨论】:
-
是否抛出了未处理的异常或者它只是失败了?事件日志中有任何内容吗?
-
+100 个混淆点,用于将 DLL 函数导入与 VB 混合。您尝试过 C#吗?
-
您有机会查看我的答案吗?我很好奇它是否对你有用。
标签: asp.net vb.net impersonation