2008-10-29 1 views
3

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

По умолчанию 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> 

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

Мой 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] Before1: Текущий Princupal = DOMAIN \ User [5288] После того, как: Текущий Princupal = DOMAIN \ User

Outpu т то же самое с

<identity impersonate="false"/> 

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

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

Спасибо!

@Edit: Rob, спасибо за отзыв! Ярлык $ user показывает мне, что все происходит так, как я ожидаю: с олицетворениями у меня есть процесс, выполняющий пользователя NT AUTHORITY \ NETWORK SERVICE, и поток имеет DOMAIN \ User перед WindowsIdentity.Impersonate (IntPtr.Zero) и «No Token. Нить не выдавала себя за руки. после. Но 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 shared services, управляющим разрешением профиля пользователя, но это еще один вопрос.

ответ

1

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

  • в то время как на контрольной точке в Debug типа $ пользователя в окне просмотра, который покажет вам процесс и нить идентичности.
  • Использование Олицетворять неверен, попробуйте этот код:

    // 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(); 
        } 
    } 
    
+0

Спасибо за этот отзыв о пользователе $. Для пользователя $ он показывает, что (теперь у меня ) все так, как я ожидал. Перед WindowsIdentity.Impersonate (IntPtr.Zero) есть токен пользователя без имени и без токена, и этот процесс находится под NETWORK SERVICE – axk 2008-10-29 17:42:57

+0

Но System.Threading.Thread.CurrentPrincipal.Identity.Name и HttpContext.Current.User.Identity .Name все равно дает мне олицетворяемого пользователя. – axk 2008-10-29 17:43:39

1

Что HttpContext.User.Identity.Name дать вам?

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

Вы находитесь в активном каталоге, в котором есть странная локальная политика?