ASP.NET aspx код страницы выполняется олицетворением, хотя олицетворение отключено - PullRequest
3 голосов
/ 29 октября 2008

У меня есть пустое тестовое приложение, созданное в VS 2005 как приложение ASP.NET. MSDN говорит , что

По умолчанию ASP.NET не использует олицетворение, и ваш код выполняется с использованием идентификатора процесса приложения ASP.NET.

И у меня есть следующий web.config

<configuration>

    <appSettings/>
    <connectionStrings/>

    <system.web>
        <!-- 
            Set compilation debug="true" to insert debugging 
            symbols into the compiled page. Because this 
            affects performance, set this value to true only 
            during development.
        -->
        <compilation debug="true" defaultLanguage="c#" />
        <!--
            The <authentication> section enables configuration 
            of the security authentication mode used by 
            ASP.NET to identify an incoming user. 
        -->
        <authentication mode="Windows"/>
        <identity impersonate="false"/>
        <!--
            The <customErrors> section enables configuration 
            of what to do if/when an unhandled error occurs 
            during the execution of a request. Specifically, 
            it enables developers to configure html error pages 
            to be displayed in place of a error stack trace.

        <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
            <error statusCode="403" redirect="NoAccess.htm" />
            <error statusCode="404" redirect="FileNotFound.htm" />
        </customErrors>
        -->
    </system.web>
</configuration>

Так что кажется, что олицетворение отключено так же, как статья предлагает.

У меня aspx по умолчанию пустое, а код позади

namespace TestWebapp
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            System.Diagnostics.Debug.WriteLine(String.Format("Before1: Current Princupal = {0}", Thread.CurrentPrincipal.Identity.Name));
            WindowsImpersonationContext ctx = WindowsIdentity.Impersonate(IntPtr.Zero);
            try
            {
                int a = 0;
                System.Diagnostics.Debug.WriteLine(String.Format("After: Current Princupal = {0}", Thread.CurrentPrincipal.Identity.Name));
            } finally
            {
                ctx.Undo();
            }

        }
    }
}

Когда я перезагружаю страницу, я получаю следующий отладочный вывод:

[5288] До 1: Текущий Princupal = DOMAIN \ User [5288] После: Current Princupal = DOMAIN \ User

Выход такой же, как у

<identity impersonate="false"/>

Веб-сайт использует пул приложений по умолчанию, и пул настроен на использование учетной записи NETWORK SERVICE для своих рабочих процессов. Я уверен, что приложение использует файл web.config, который должен использовать, и рабочий процесс w3p.exe выполняется в режиме NETWORK SERVICE.

Что может быть не так в этом случае?

Спасибо!

@ Редактировать: Роб, спасибо за совет! Ярлык $ user показывает мне, что все происходит так, как я ожидал: при олицетворении у меня запущен процесс, выполняющий пользователя NT AUTHORITY \ NETWORK SERVICE, а поток имеет DOMAIN \ User перед WindowsIdentity.Impersonate (IntPtr.Zero) и "No Token. Thread не подражая ". после. Но Thread.CurrentPrincipal.Identity.Name и HttpContext.Current.User.Identity.Name по-прежнему дают мне DOMAIN \ User в обоих местах.

@ Edit: я узнал, что для изменения Thread.CurrentPrincipal и HttpContext.Current.User мне нужно сделать это вручную:

Thread.CurrentPrincipal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
HttpContext.Current.User = Thread.CurrentPrincipal;

Я не уверен, какой смысл здесь, но все равно. Теперь у меня проблема с общими службами sharepoint для управления разрешениями профиля пользователя, но это другой вопрос.

Ответы [ 2 ]

1 голос
/ 29 октября 2008

Что дает HttpContext.User.Identity.Name?

Предположим, вы проверили вкладку безопасности в IIS, что она разрешает анонимный доступ?

Вы в активном каталоге с какой-то странной локальной политикой?

1 голос
/ 29 октября 2008

Кажется странным, Несколько вещей, чтобы попробовать:

  • Находясь на точке останова в Debug, введите $ user в окне наблюдения, которое покажет вам идентификатор процесса и потока.
  • Вы используете неверное имя неверно, попробуйте этот код:

    // Declare the logon types as constants
    const long LOGON32_LOGON_INTERACTIVE = 2;
    const long LOGON32_LOGON_NETWORK = 3;
    
    // Declare the logon providers as constants
    const long LOGON32_PROVIDER_DEFAULT = 0;
    const long LOGON32_PROVIDER_WINNT50 = 3;
    const long LOGON32_PROVIDER_WINNT40 = 2;
    const long LOGON32_PROVIDER_WINNT35 = 1;
    
    [DllImport("advapi32.dll", EntryPoint = "LogonUser")]
    private static extern bool LogonUser(
        string lpszUsername,
        string lpszDomain,
        string lpszPassword,
        int dwLogonType,
        int dwLogonProvider,
        ref IntPtr phToken);
    
    public static WindowsImpersonationContext ImpersonateCurrentUserBegin(System.Net.NetworkCredential credential)
    {
        WindowsImpersonationContext impersonationContext = null;
        if (credential == null || credential.UserName.Length == 0 || credential.Password.Length == 0 || credential.Domain.Length == 0)
        {
            throw new Exception("Incomplete user credentials specified");
        }
        impersonationContext = Security.Impersonate(credential);
        if (impersonationContext == null)
        {
            return null;
        }
        else
        {
            return impersonationContext;
        }
    }
    
    public static void ImpersonateCurrentUserEnd(WindowsImpersonationContext impersonationContext)
    {
        if (impersonationContext != null)
        {
            impersonationContext.Undo();
        }
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...