У меня есть пустое тестовое приложение, созданное в 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 для управления разрешениями профиля пользователя, но это другой вопрос.