Bir ASP.NET uygulamasında kimliğe bürünme nasıl

Makale çevirileri Makale çevirileri
Makale numarası: 306158 - Bu makalenin geçerli olduğu ürünleri görün.
Bu makalede, aşağıdaki Microsoft .NET için denilmektedir. Framework sınıf kitaplığı ad:
  • System.Web.Security
  • System.Security.Principal
  • System.Runtime.InteropServices
Hepsini aç | Hepsini kapa

Bu Sayfada

Özet

Bu makalede, uygulamak için farklı yöntemler bir ASP.NET uygulamasında kimliğe bürünme.

Daha fazla bilgi

ASP iş parçacığı üzerinde kullanıcı kimliğine bürünmek istiyorsanız, üzerinde requirments aşağıdaki yöntemlerden birini kullanabilirsiniz: Not İş parçacığı kullanıcı hangi belirlemek için aşağıdaki kodu kullanabilirsiniz olarak çalıştırma:
System.Security.Principal.WindowsIdentity.GetCurrent().Name
				

IIS kimlik doğrulaması taklit hesabı veya kullanıcı

Microsoft Internet Information Services (IIS) taklit etmek için her isteği her sayfası bir ASP.NET uygulaması için kullanıcı kimlik doğrulaması, eklemeniz gerekir bir <identity></identity> etiketi bu uygulamanın Web.config dosyasında ve impersonate özniteliği trueolarak ayarlayın. Örneğin:
<identity impersonate="true" />
				

Tüm istekleri bir ASP.NET uygulaması için belirli bir kullanıcının kimliğine bürün

Tüm sayfalardaki tüm istekleri için belirli bir kullanıcının kimliğine bürünmek için bir ASP.NET uygulaması kullanıcı adı ve parola öznitelikleri belirtebilirsiniz <identity></identity> söz konusu uygulamanın Web.config dosyasında etiket. Örneğin:
<identity impersonate="true" userName="accountname" password="password" />
				
Not Üzerinde belirli bir kullanıcıyı taklit eden işlem kimliği bir iş parçacığı, "işletim sisteminin bir parçası çalış" ayrıcalığının olması gerekir. Tarafından Varsayılan, Aspnet_wp.exe işlemi ASPNET adlı bir bilgisayar hesabı altında çalışır. Ancak, bu hesabı taklit etmek için gereken ayrıcalıklara sahip değil bir Belirli bir kullanıcı. Taklit çalışırsanız bir hata iletisi alırsınız bir Belirli bir kullanıcı. Bu bilgiler yalnızca .NET Framework 1.0 için geçerlidir. Bu ayrıcalık .NET Framework 1.1 için gerekli değildir.

Geçici bir çözüm bulmak için Bu sorun, aşağıdaki yöntemlerden birini kullanın:
  • "İşletim sisteminin bir parçası çalış" ayrıcalığı ASPNET hesabı için (en düşük ayrıcalıklı hesabı).

    Not Bu soruna geçici bir çözüm bulmak için bu yöntemi kullanabilirsiniz, ancak Microsoft, bu yöntem önermez.
  • Aspnet_wp.exe işlemi çalıştığı hesabı değiştirme Sistem altında <processModel>yapılandırma bölümünde hesap Machine.config dosyasının.</processModel>

Kod kimlik doğrulama kullanıcı kimliğine bürün

Yalnızca belirli bir bölümü kod çalıştırdığınızda kullanabilirsiniz (User.Identity) kimlik doğrulama kullanıcı kimliğine bürünmek için kod izleyin. Bu yöntem kimlik doğrulama kullanıcı kimliği gerektirir WindowsIdentitytürüdür.

Visual Basic .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()

'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();
				

Kod içinde belirli bir kullanıcının kimliğine bürün

Yalnızca belirli bir çalıştırdığınızda, belirli bir kullanıcının kimliğine bürünmek için bölüm kodunu, şu kodu kullanın:

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 = 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
</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>
				
Not Üzerinde belirli bir kullanıcıyı taklit eden işlem kimliği bir iş parçacığı "işletim sisteminin bir parçası çalış" ayrıcalığına sahip olması gerekir Aspnet_wp.exe işlemi Microsoft Windows 2000 tabanlı bir bilgisayarda çalıştırıyorsanız. , "İşletim sisteminin bir parçası çalış" ayrıcalığı gerekli değildir, Aspnet_wp.exe işlemini çalıştıran Windows XP tabanlı bir bilgisayarda veya Windows Server 2003 tabanlı bir bilgisayar. Varsayılan olarak, Aspnet_wp.exe işlemi ASPNET adlı bir bilgisayar hesabının altında çalışır. Ancak, bu hesap yapar Belirli bir kullanıcının kimliğine bürünmek için gereken ayrıcalıklara sahip değil. Aldığınız bir Belirli bir kullanıcının kimliğine bürünmek çalışırsanız, hata iletisi. .

Bu soruna geçici bir çözüm için aşağıdaki yöntemlerden birini kullanın:
  • "İşletim sisteminin bir parçası çalış" ayrıcalığı ASPNET hesabı için.

    Not Geçici bir çözüm bulmak için bu yöntemi önermiyoruz sorun.
  • Aspnet_wp.exe işlemi çalıştığı hesabı değiştirme Sistem altında <processModel>yapılandırma bölümünde hesap Machine.config dosyasının.</processModel>

Referanslar

Hakkında ek bilgi için ASP.NET güvenliği makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın Microsoft Knowledge Base:
306590ASP.NET güvenliğine genel bakış

Özellikler

Makale numarası: 306158 - Last Review: 7 Haziran 2013 Cuma - Gözden geçirme: 5.0
Bu makaledeki bilginin uygulandığı durum:
  • 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
Anahtar Kelimeler: 
kbinfo kbsecurity kbmt KB306158 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, Microsoft Makine Çevirisi Düzenleme yazılımı tarafından tercüme edilmiş olup, yüksek olasılıkla profesyonel bir çevirmen yerine CTF teknolojisi kullanılarak, Microsoft Topluluğu tarafından düzenlenmiştir. Microsoft, Bilgi Bankamız içindeki tüm makaleleri kendi dilinizde okuyabilmeniz için size hem profesyonel çevirmenler tarafından tercüme edilen hem de makine tarafından tercüme edildikten sonra Topluluk tarafından kontrol edilen makaleler sunar. Bununla birlikte, makine tarafından tercüme edilen, hatta Topluluk tarafından kontrol edilen bir makale bile her zaman mükemmel dil kalitesinde olmayabilir. Makalede dilinizi konuşan yabancı birisinin yapabileceği türden sözcük, söz dizimi veya dilbilgisi hataları bulunabilir. Microsoft, içeriğin hatalı tercümesinin veya müşterilerimiz tarafından kullanımının doğurabileceği olası yanlış anlamalar, hatalar veya zararlardan sorumlu değildir. Öte yandan Microsoft, Makine Çevirisi Düzenleme işlemini geliştirmek amacıyla Makine Çevirisi Düzenleme yazılımını ve araçlarını sık sık güncelleştirmektedir.
Makalenin İngilizcesi aşağıdaki gibidir: 306158

Geri Bildirim Ver

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com