2010-04-30 37 views
8

Trong .net khi một trang web được lưu trữ trong IIS, làm thế nào để bạn có được người dùng hiện tại trang web đang chạy dưới. tức là người dùng Ứng dụng Pool không phải là người dùng hiện tại đang truy cập trang web.Cách tải người dùng ứng dụng hiện tại trong IIS khi sử dụng impersonate = true?

Sử dụng cửa sổ được tích hợp và mạo danh.

<authentication mode="Windows"/> 
<identity impersonate="true"/> 
+0

để làm gì? Có lẽ lược đồ mạo danh của bạn không chính xác nếu bạn cần tải người dùng ứng dụng cho một số hành động. –

Trả lời

18

Để trở lại cho người sử dụng hồ bơi ứng dụng trong quản lý mã bạn có thể làm như sau:

using (WindowsIdentity.Impersonate(IntPtr.Zero)) 
{ 
    //This code executes under app pool user 
} 
+0

[Liên kết nhanh] (https://msdn.microsoft.com/en-us/library/chf6fbt4 (v = vs.110) .aspx # remarksToggle) đến tài liệu liên quan. –

0

Nếu bạn hoàn toàn cần xem người dùng thì bạn không thể sử dụng Environment.UserName?

Tôi vừa định cấu hình lại môi trường của mình để chạy với nhóm Ứng dụng cổ điển (có Mạo danh) và Người dùng xuất hiện dưới dạng IUSR với Mạo danh.

+0

Tôi thực sự muốn WindowsIdentity không phải là tên người dùng – Simon

2

Tìm thấy giải pháp.

Sử dụng RevertToSelf, bạn có thể loại bỏ mạo danh khỏi chuỗi. Trong IIS, điều này tương đương với người dùng App Pool.

Một số doco

http://www.pinvoke.net/default.aspx/advapi32.reverttoself

http://msdn.microsoft.com/en-us/library/aa379317%28VS.85%29.aspx

Và mã

[DllImport("advapi32.dll", SetLastError = true)] 
    static extern bool RevertToSelf(); 

    private static WindowsIdentity GetAppPoolIdentity() 
    { 
     WindowsIdentity identity = null; 
     Win32Exception win32Exception = null; 
     var thread = new Thread(o => 
         { 
          if (!RevertToSelf()) 
          { 
           var win32error = Marshal.GetLastWin32Error(); 
           win32Exception = new Win32Exception(win32error); 
          } 

          identity = WindowsIdentity.GetCurrent(); 
         }); 
     thread.Start(); 
     thread.Join(); 
     if (win32Exception != null) 
     { 
      throw win32Exception; 
     } 
     return identity; 
    } 
+0

Có thể sử dụng ** 'this.Request.LogonUserIdentity.Name' ** – Kiquenet

0

John Simons: Chính xác những gì tôi muốn, Cảm ơn. Đối với phiên bản VB.net:

With System.Security.Principal.WindowsIdentity.Impersonate(IntPtr.Zero) 
    Dim sCurrentUserName As String = System.Security.Principal.WindowsIdentity.GetCurrent.Name 
End With 
Các vấn đề liên quan