advapi32.dll的LogonUserA是否会影响ASP.net中的整个应用程序池?

天堂之心

请注意以下文章:

如何在ASP.NET应用程序中实现模拟

特别是“模拟代码中的特定用户”位。

它利用advapi32.dll的LogonUserA()DuplicateToken()方法(Windows API?)。

如果我们在特定的aspx文件(函数)中使用此方法来模拟“ DOMAIN \ John Smith”以完成特定任务-我们可以肯定地说只有单个aspx请求可以模仿John,或者整个应用程序池都可以像John Smith一样运行直到在所述功能完成时调用undoImpersonation()?

有问题的代码(以防上面的链接变暗):

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)
    If impersonateValidUser("username", "domain", "password") Then
        'Insert your code that runs under the security context of a specific user here.
        undoImpersonation()
    Else
        'Your impersonation failed. Therefore, include a fail-safe mechanism here.
    End If
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
鼠尾草紫

模拟是特定于线程的,而不是整个应用程序的模拟。我修改了您的page_load以包含一个简单的逻辑来证明这一事实。

示范

原始用户(应用程序池)和模拟用户都将以不同的时间间隔在调试控制台中写入。请注意,模拟用户正在从另一个线程运行,并且每秒将输出其用户名一次,而应用程序池用户(主线程)的输出仍保留在主线程上,并每100毫秒输出一次其名称。

Public Sub Page_Load(ByVal s As Object, ByVal e As EventArgs)
    Dim Task As New System.Threading.Tasks.Task(Sub()
                                                    If impersonateValidUser("Username", "Domain", "Password") Then

                                                        Dim Watch As New Diagnostics.Stopwatch()
                                                        Watch.Start()

                                                        While Watch.ElapsedMilliseconds < 10000
                                                            System.Threading.Thread.Sleep(1000)
                                                            Diagnostics.Debug.WriteLine(WindowsIdentity.GetCurrent.Name)
                                                        End While

                                                        'Insert your code that runs under the security context of a specific user here.
                                                        undoImpersonation()
                                                    Else
                                                        'Your impersonation failed. Therefore, include a fail-safe mechanism here.
                                                    End If
                                                End Sub)

    Task.Start()
    While Not Task.IsCompleted
        System.Threading.Thread.Sleep(100)
        Diagnostics.Debug.WriteLine("--" & WindowsIdentity.GetCurrent.Name)
    End While

End Sub

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

advapi32.dll的LogonUserA是否会影响ASP.net中的整个应用程序池?

来自分类Dev

ASP.NET中的应用程序池与应用程序域回收?

来自分类Dev

默认情况下,Azure网站中的应用程序池是否对整个Web目录具有写权限?

来自分类Dev

如何在asp.net部署脚本中包含应用程序池规范?

来自分类Dev

当应用程序池在ASP.NET MVC中回收时会发生什么?

来自分类Dev

通过自托管ASP.NET应用程序回收应用程序池

来自分类Dev

应用程序池回收如何影响ASP Net Session State?

来自分类Dev

如何在整个ASP .NET MVC应用程序中要求授权

来自分类Dev

为整个应用程序而不是ASP.NET中的单个页面设置UICulture

来自分类Dev

ASP.NET应用程序池回收会刷新静态对象上的缓存吗?

来自分类Dev

将.NET DLL中的32位本机DLL包装为在64位.NET应用程序中使用

来自分类Dev

从C#调用Advapi32.dll本机EventWrite函数?

来自分类Dev

从C#调用Advapi32.dll本机EventWrite函数?

来自分类Dev

试图了解ASP.NET MVC中应用程序池刷新和视图的预编译的更详细信息

来自分类Dev

此Asp.Net WebAPI控制器方法是否正确换出应用程序池?

来自分类Dev

* .m文件中的类别声明会影响整个应用程序

来自分类Dev

如何检测整个应用程序是否在android中关闭

来自分类Dev

我的经典ASP脚本包含要求启用和禁用32位应用程序池的两行

来自分类Dev

如何为部署到AWS Elastic Beanstalk的ASP.NET应用程序设置应用程序池标识

来自分类Dev

如何为部署到AWS Elastic Beanstalk的ASP.NET应用程序设置应用程序池标识

来自分类Dev

我可以将32位本机dll(不是.Net程序集)链接到我的64位.Net应用程序中吗?

来自分类Dev

Asp.net身份(MVC 5)跨子域登录和应用程序池身份

来自分类Dev

ASP.NET MVC 5:应用程序池,Windows身份验证和Active Directory

来自分类Dev

如何通过代码(C#,ASP.net)获取应用程序池名称

来自分类Dev

使用IUSR而不是应用程序池标识的ASP.NET Web服务

来自分类Dev

CPU,内存使用情况,线程池使用情况-ASP NET核心身份未确认的邮件用户删除处理-在应用程序中还是在单独的应用程序中?

来自分类Dev

EasyHook:从本机C应用程序中的32位应用程序注入64位dll吗?

来自分类Dev

在整个ASP.NET MVC应用程序中是否可以使用具有恒定值的url参数?

来自分类Dev

web.appsettings.config中的更改是否触发应用程序池回收?

Related 相关文章

  1. 1

    advapi32.dll的LogonUserA是否会影响ASP.net中的整个应用程序池?

  2. 2

    ASP.NET中的应用程序池与应用程序域回收?

  3. 3

    默认情况下,Azure网站中的应用程序池是否对整个Web目录具有写权限?

  4. 4

    如何在asp.net部署脚本中包含应用程序池规范?

  5. 5

    当应用程序池在ASP.NET MVC中回收时会发生什么?

  6. 6

    通过自托管ASP.NET应用程序回收应用程序池

  7. 7

    应用程序池回收如何影响ASP Net Session State?

  8. 8

    如何在整个ASP .NET MVC应用程序中要求授权

  9. 9

    为整个应用程序而不是ASP.NET中的单个页面设置UICulture

  10. 10

    ASP.NET应用程序池回收会刷新静态对象上的缓存吗?

  11. 11

    将.NET DLL中的32位本机DLL包装为在64位.NET应用程序中使用

  12. 12

    从C#调用Advapi32.dll本机EventWrite函数?

  13. 13

    从C#调用Advapi32.dll本机EventWrite函数?

  14. 14

    试图了解ASP.NET MVC中应用程序池刷新和视图的预编译的更详细信息

  15. 15

    此Asp.Net WebAPI控制器方法是否正确换出应用程序池?

  16. 16

    * .m文件中的类别声明会影响整个应用程序

  17. 17

    如何检测整个应用程序是否在android中关闭

  18. 18

    我的经典ASP脚本包含要求启用和禁用32位应用程序池的两行

  19. 19

    如何为部署到AWS Elastic Beanstalk的ASP.NET应用程序设置应用程序池标识

  20. 20

    如何为部署到AWS Elastic Beanstalk的ASP.NET应用程序设置应用程序池标识

  21. 21

    我可以将32位本机dll(不是.Net程序集)链接到我的64位.Net应用程序中吗?

  22. 22

    Asp.net身份(MVC 5)跨子域登录和应用程序池身份

  23. 23

    ASP.NET MVC 5:应用程序池,Windows身份验证和Active Directory

  24. 24

    如何通过代码(C#,ASP.net)获取应用程序池名称

  25. 25

    使用IUSR而不是应用程序池标识的ASP.NET Web服务

  26. 26

    CPU,内存使用情况,线程池使用情况-ASP NET核心身份未确认的邮件用户删除处理-在应用程序中还是在单独的应用程序中?

  27. 27

    EasyHook:从本机C应用程序中的32位应用程序注入64位dll吗?

  28. 28

    在整个ASP.NET MVC应用程序中是否可以使用具有恒定值的url参数?

  29. 29

    web.appsettings.config中的更改是否触发应用程序池回收?

热门标签

归档