Làm thế nào để thực hiện mạo danh trong một ASP.NET application

QUAN TRỌNG: Bài viết này được dịch bằng phần mềm dịch máy của Microsoft chứ không phải do con người dịch. Microsoft cung cấp các bài viết do con người dịch và cả các bài viết do máy dịch để bạn có thể truy cập vào tất cả các bài viết trong Cơ sở Kiến thức của chúng tôi bằng ngôn ngữ của bạn. Tuy nhiên, bài viết do máy dịch không phải lúc nào cũng hoàn hảo. Loại bài viết này có thể chứa các sai sót về từ vựng, cú pháp hoặc ngữ pháp, giống như một người nước ngoài có thể mắc sai sót khi nói ngôn ngữ của bạn. Microsoft không chịu trách nhiệm về bất kỳ sự thiếu chính xác, sai sót hoặc thiệt hại nào do việc dịch sai nội dung hoặc do hoạt động sử dụng của khách hàng gây ra. Microsoft cũng thường xuyên cập nhật phần mềm dịch máy này.

Nhấp chuột vào đây để xem bản tiếng Anh của bài viết này:306158
Bài viết này đề cập đến Microsoft sau.NET Khuôn khổ không gian tên thư viện lớp:
  • System.web.Security
  • System.Security.Principal
  • System.Runtime.InteropServices
TÓM TẮT
Bài viết này mô tả những cách khác nhau để thực hiện mạo danh trong một ASP.NET ứng dụng.
THÔNG TIN THÊM
Nếu bạn muốn mạo danh người dùng trên một sợi trong ASP.NET, bạn có thể sử dụng một trong những phương pháp sau đây, dựa trên requirments của bạn:
Chú ý Bạn có thể sử dụng mã sau đây để xác định những gì người dùng thread thực hiện như là:
System.Security.Principal.WindowsIdentity.GetCurrent().Name				

Mạo danh IIS xác thực tài khoản hoặc người sử dụng

Mạo danh Microsoft Internet Information Services (IIS) chứng thực người dùng trên mọi yêu cầu cho tất cả các trang trong một ASP.Ứng dụng NET, bạn phải bao gồm một <identity></identity> từ khóa trong file Web.config của ứng dụng này và thiết lập các mạo danh thuộc tính cho sự thật. Ví dụ:
<identity impersonate="true" />				
Quay lại đầu trang

Mạo danh người dùng cụ thể cho tất cả các yêu cầu của một ASP.NET Application

Mạo danh người dùng cụ thể cho tất cả các yêu cầu trên tất cả các trang của một ASP.NET ứng dụng, bạn có thể chỉ định các tên người dùngmật khẩu thuộc tính trong các <identity></identity> từ khóa tập tin Web.config cho rằng ứng dụng. Ví dụ:
<identity impersonate="true" userName="accountname" password="password" />				
Chú ý Danh tính của quá trình impersonates một người sử dụng cụ thể trên một chủ đề phải có đặc quyền "Hoạt động như một phần của hệ điều hành". Bởi mặc định, quá trình Aspnet_wp.exe chạy dưới tài khoản máy tính được đặt tên ASPNET. Tuy nhiên, tài khoản này không có đủ quyền để mạo danh một người sử dụng cụ thể. Bạn nhận được một thông báo lỗi nếu bạn cố gắng mạo danh một người sử dụng cụ thể. Thông tin này áp dụng chỉ để các.NET Framework 1.0. Điều này đặc quyền không phải là cần thiết cho các.NET Framework 1.1.

Chỉnh sửa vấn đề này, sử dụng một trong những phương pháp sau đây:
  • Cấp đặc quyền "Hoạt động như một phần của hệ điều hành" tài khoản ASPNET (ít nhất là đặc quyền tài khoản).

    Chú ý Mặc dù bạn có thể sử dụng phương pháp này để làm việc xung quanh vấn đề, Microsoft không khuyên bạn nên phương pháp này.
  • Thay đổi các tài khoản trong quá trình Aspnet_wp.exe chạy dưới hệ thống chiếm trong phần cấu hình <processmodel> của tệp Machine.config.</processmodel>
Quay lại đầu trang

Mạo danh người sử dụng Authenticating trong mã

Mạo danh người dùng (authenticatingUser.Identity) chỉ khi bạn chạy một phần cụ thể của mã, bạn có thể sử dụng các Mã số để làm theo. Phương pháp này đòi hỏi rằng danh tính người dùng authenticating là loại WindowsIdentity.

Visual Basic.NET
Dim impersonationContext As System.Security.Principal.WindowsImpersonationContextDim currentWindowsIdentity As System.Security.Principal.WindowsIdentitycurrentWindowsIdentity = CType(User.Identity, System.Security.Principal.WindowsIdentity)impersonationContext = currentWindowsIdentity.Impersonate()'Insert your code that runs under the security context of the authenticating user here.impersonationContext.Undo()				
Visual C#.NET
System.Security.Principal.WindowsImpersonationContext impersonationContext;impersonationContext =     ((System.Security.Principal.WindowsIdentity)User.Identity).Impersonate();//Insert your code that runs under the security context of the authenticating user here.impersonationContext.Undo();				
Visual J#.NET
System.Security.Principal.WindowsImpersonationContext impersonationContext;impersonationContext =     ((System.Security.Principal.WindowsIdentity)get_User().get_Identity()).Impersonate();//Insert your code that runs under the security context of the authenticating user here.impersonationContext.Undo();				
Quay lại đầu trang

Mạo danh người dùng cụ thể trong mã

Mạo danh người dùng cụ thể chỉ khi bạn chạy một cụ thể phần của mã, sử dụng mã sau đây:

Visual Basic.NET
<%@ Page Language="VB" %><%@ Import Namespace = "System.Web" %><%@ Import Namespace = "System.Web.Security" %><%@ Import Namespace = "System.Security.Principal" %><%@ Import Namespace = "System.Runtime.InteropServices" %><script runat=server>Dim LOGON32_LOGON_INTERACTIVE As Integer = 2Dim LOGON32_PROVIDER_DEFAULT As Integer = 0Dim impersonationContext As WindowsImpersonationContextDeclare 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 IntegerDeclare Auto Function DuplicateToken Lib "advapi32.dll" ( _                        ByVal ExistingTokenHandle As IntPtr, _                        ByVal ImpersonationLevel As Integer, _                        ByRef DuplicateTokenHandle As IntPtr) As IntegerDeclare Auto Function RevertToSelf Lib "advapi32.dll" () As LongDeclare Auto Function CloseHandle Lib "kernel32.dll" (ByVal handle As IntPtr) As LongPublic 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 IfEnd SubPrivate 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 IfEnd FunctionPrivate Sub undoImpersonation()    impersonationContext.Undo()End Sub</script>
Visual C#.NET
<%@ Page Language="C#"%><%@ Import Namespace = "System.Web" %><%@ Import Namespace = "System.Web.Security" %><%@ Import Namespace = "System.Security.Principal" %><%@ Import Namespace = "System.Runtime.InteropServices" %><script runat=server>public const int LOGON32_LOGON_INTERACTIVE = 2;public const int LOGON32_PROVIDER_DEFAULT = 0;WindowsImpersonationContext impersonationContext; [DllImport("advapi32.dll")]public static extern int LogonUserA(String lpszUserName, 	String lpszDomain,	String lpszPassword,	int dwLogonType, 	int dwLogonProvider,	ref IntPtr phToken);[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]public static extern int DuplicateToken(IntPtr hToken, 	int impersonationLevel,  	ref IntPtr hNewToken);                          [DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]public static extern bool RevertToSelf();[DllImport("kernel32.dll", CharSet=CharSet.Auto)]public static extern  bool CloseHandle(IntPtr handle);public void Page_Load(Object s, EventArgs e){	if(impersonateValidUser("username", "domain", "password"))	{		//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.	}}private bool impersonateValidUser(String userName, String domain, String password){	WindowsIdentity tempWindowsIdentity;	IntPtr token = IntPtr.Zero;	IntPtr tokenDuplicate = IntPtr.Zero;	if(RevertToSelf())	{		if(LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE, 			LOGON32_PROVIDER_DEFAULT, ref token) != 0)		{			if(DuplicateToken(token, 2, ref tokenDuplicate) != 0) 			{				tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);				impersonationContext = tempWindowsIdentity.Impersonate();				if (impersonationContext != null)				{					CloseHandle(token);					CloseHandle(tokenDuplicate);					return true;				}			}		} 	}	if(token!= IntPtr.Zero)		CloseHandle(token);	if(tokenDuplicate!=IntPtr.Zero)		CloseHandle(tokenDuplicate);	return false;}private void undoImpersonation(){	impersonationContext.Undo();}</script>
Visual J#.NET
<%@ Page language="VJ#" %><%@ Import Namespace="System.Web" %><%@ Import Namespace="System.Web.Security" %><%@ Import Namespace="System.Security.Principal" %><%@ Import Namespace="System.Runtime.InteropServices" %><script runat=server>public static int LOGON32_LOGON_INTERACTIVE = 2;public static int LOGON32_PROVIDER_DEFAULT = 0;WindowsImpersonationContext impersonationContext; /** @attribute DllImport("advapi32.dll") */ public static native int LogonUserA(String lpszUserName, 	String lpszDomain, 	String lpszPassword,	int dwLogonType, 	int dwLogonProvider, 	System.IntPtr[] phToken);/** @attribute DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true) */ public static native int DuplicateToken(System.IntPtr hToken,	int impersonationLevel,	System.IntPtr[] hNewToken);/** @attribute DllImport("kernel32.dll",CharSet=CharSet.Auto) */ public static native  boolean CloseHandle(System.IntPtr[] handle);/** @attribute DllImport("advapi32.dll", 	 CharSet=CharSet.Auto,SetLastError=true) */	 public static native boolean RevertToSelf();public void Page_Load(Object s, System.EventArgs e){	if(impersonateValidUser("username", "domain", " password"))	{		//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.	}}private boolean impersonateValidUser(String userName, String domain, String password){	WindowsIdentity tempWindowsIdentity;	System.IntPtr[] token = new System.IntPtr[1];	System.IntPtr[] tokenDuplicate = new System.IntPtr[1];	if(RevertToSelf())	{		if(LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE, 			LOGON32_PROVIDER_DEFAULT, token) != 0)		{			if(DuplicateToken(token[0], 2, tokenDuplicate) != 0) 			{				tempWindowsIdentity = new WindowsIdentity(tokenDuplicate[0]);				impersonationContext = tempWindowsIdentity.Impersonate();				if (impersonationContext != null)				{					CloseHandle(tokenDuplicate);					CloseHandle(token);					return true;				}							}					} 	}	if(!token[0].Equals(System.IntPtr.Zero))		CloseHandle(token);	if(!tokenDuplicate[0].Equals(System.IntPtr.Zero))		CloseHandle(tokenDuplicate);	return false;}private void undoImpersonation(){	impersonationContext.Undo();}</script>				
Chú ý Danh tính của quá trình impersonates một người sử dụng cụ thể trên một chủ đề phải có đặc quyền "Hoạt động như một phần của hệ điều hành" Nếu quá trình Aspnet_wp.exe chạy trên một máy tính dựa trên Microsoft Windows 2000. Các Đặc quyền "Hoạt động như một phần của hệ điều hành" là không cần thiết nếu các Aspnet_wp.exe quá trình đang chạy trên một máy tính dựa trên Windows XP hoặc trên một máy chủ Windows 2003 dựa trên máy tính. Theo mặc định, Aspnet_wp.exe quá trình chạy dưới tài khoản máy tính được đặt tên ASPNET. Tuy nhiên, tài khoản này nào không có đủ quyền để mạo danh người dùng cụ thể. Bạn nhận được một thông báo lỗi nếu bạn cố gắng mạo danh người dùng cụ thể. .

Để làm việc xung quanh vấn đề này, sử dụng một trong những phương pháp sau đây:
  • Cấp đặc quyền "Hoạt động như một phần của hệ điều hành" vào tài khoản của ASPNET.

    Chú ý Chúng tôi không khuyên bạn nên phương pháp này để làm việc xung quanh các vấn đề.
  • Thay đổi các tài khoản trong quá trình Aspnet_wp.exe chạy dưới hệ thống chiếm trong phần cấu hình <processmodel> của tệp Machine.config.</processmodel>
Quay lại các đầu trang
THAM KHẢO
Để thêm thông tin về ASP.NET bảo mật, bấm số bài viết sau đây để xem các bài viết trong các Cơ sở kiến thức Microsoft:
306590ASP.Tổng quan về an ninh mạng
đăng nhập thất bại null (null) mạo danh

Cảnh báo: Bài viết này được dịch tự động

Thuộc tính

ID Bài viết: 306158 - Xem lại Lần cuối: 09/22/2011 20:02:00 - Bản sửa đổi: 3.0

Microsoft ASP.NET 1.0, Microsoft ASP.NET 1.1, Microsoft Visual Basic .NET 2002 Standard Edition, Microsoft Visual Basic .NET 2003 Standard Edition, Microsoft Visual C# .NET 2002 Standard Edition, Microsoft Visual C# .NET 2003 Standard Edition, Microsoft Visual J# .NET 2003 Standard Edition

  • kbinfo kbsecurity kbmt KB306158 KbMtvi
Phản hồi