Реализация обезличения в ASP.NET приложении

В этой статье описываются различные способы реализации обезличения в ASP.NET приложении.

Оригинальная версия продукта:   ASP.NET
Исходный номер КБ:   306158

Сводка

В этой статье вводится, как реализовать обезличение путем изменения Web.config файла и запуска определенного раздела кода.

Он относится к следующим пространствам имен Платформа .NET Framework Microsoft:

  • System.Web.Security
  • System.Security.Principal
  • System.Runtime.InteropServices

Вы можете использовать следующий код, чтобы определить, какой пользователь выполняет поток как:

System.Security.Principal.WindowsIdentity.GetCurrent().Name

Выдать себя за учетную запись или пользователя с проверкой подлинности IIS

Чтобы выдать себя за пользователя службы IIS (IIS) на каждом запросе на каждую страницу в приложении ASP.NET, необходимо включить тег в файл Web.config этого приложения и задать атрибуту <identity> true. Например:

<identity impersonate="true" />

Выдать себя за конкретного пользователя для всех запросов ASP.NET приложения

Чтобы выдать себя за конкретного пользователя для всех запросов на всех страницах приложения ASP.NET, можно указать атрибуты и тег файла Web.config для этого userName password <identity> приложения. Например:

<identity impersonate="true" userName="accountname" password="password" />

Примечание

Удостоверение процесса, который выдает себя за конкретного пользователя в потоке, должно иметь закон как часть привилегии операционной системы. По умолчанию процесс Aspnet_wp.exe под компьютерной учетной записью с именем ASPNET. Однако эта учетная запись не имеет необходимых привилегий, чтобы выдать себя за конкретного пользователя. Вы получаете сообщение об ошибке, если пытаетесь выдать себя за конкретного пользователя. Эта информация применяется только к платформа .NET Framework 1.0. Эта привилегия не требуется для платформа .NET Framework 1.1.

Чтобы решить эту проблему, используйте один из следующих методов:

  • Предоставление закона в рамках привилегии операционной системы учетной записи ASPNET (наименее привилегированной учетной записи).

    Примечание

    Хотя этот метод можно использовать для решения проблемы, Корпорация Майкрософт не рекомендует этот метод.

  • Измените учетную запись, Aspnet_wp.exe процесс выполняется в учетной записи System в разделе <processModel> конфигурации Machine.config файла.

В коде выдают себя за пользователя, подающего проверку подлинности

Чтобы выдать себя за пользователя проверки подлинности ( ) только при запуске определенного раздела кода, вы можете использовать User.Identity код, чтобы следовать. Этот метод требует, чтобы удостоверение пользователя проверки подлинности было типом WindowsIdentity .

  • 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 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>

Удостоверение процесса, который выдает себя за конкретного пользователя в потоке, должно иметь закон как часть привилегии операционной системы, если процесс Aspnet_wp.exe запущен на компьютере на Windows 2000. Закон как часть привилегии операционной системы не требуется, если процесс Aspnet_wp.exe запущен на компьютере Windows XP или на компьютере Windows Server 2003. По умолчанию процесс Aspnet_wp.exe под компьютерной учетной записью с именем ASPNET. Однако эта учетная запись не имеет необходимых привилегий, чтобы выдать себя за конкретного пользователя. Вы получаете сообщение об ошибке, если пытаетесь выдать себя за конкретного пользователя.

Чтобы решить эту проблему, используйте один из следующих методов:

  • Предоставление закона в рамках привилегии операционной системы учетной записи ASPNET.

    Примечание

    Мы не рекомендуем этот метод для решения проблемы.

  • Измените учетную запись, Aspnet_wp.exe процесс выполняется в учетной записи System в разделе <processModel> конфигурации Machine.config файла.

Ссылки

ASP.NET безопасности