Ошибка загрузки файла при аутентификации пользователя.Использование интегрированного режима IIS7 - PullRequest
2 голосов
/ 14 января 2011

Это идентификаторы пользователей, которые мой веб-сайт сообщает мне, что он использует:

Зарегистрирован: NT AUTHORITY \ NETWORK SERVICE (вообще не может записывать файлы)
и
Не вошел в систему: WSW32 \ IUSR_77 (Может записывать файлы в любую папку)

У меня есть веб-сайт ASP.NET 4.0 на веб-сервере IIS7 с общим хостом, работающим в интегрированном режиме с 32поддержка двухбитных приложений и MSSQL 2008. Использование классического режима не вариант, так как мне нужно защитить некоторые статические файлы, и я использую маршрутизацию.

В моем файле web.config я установил следующее:

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
</system.webServer>

Моя хостинговая компания говорит, что олицетворение включено по умолчанию на уровне компьютера, поэтому я не могу это изменить.

Я попросил их поддержки, и они отослали меня к этой статье: http://www.codinghub.net/2010/08/differences-between-integrated-mode-and.html

Ссылаясь на эту часть:

Различные идентификаторы Windows в проверке подлинности с помощью форм

Когда проверка подлинности с помощью форм используется приложением и разрешен анонимный доступ, вИдентификация в Tegrated Mode отличается от идентификации в Classic mode следующими способами:

* ServerVariables["LOGON_USER"] is filled.
* Request.LogognUserIdentity uses the credentials of the [NT AUTHORITY\NETWORK SERVICE] account instead of the [NT AUTHORITY\INTERNET USER] account. 

Это происходит потому, что аутентификация выполняется за один этап в интегрированном режиме.И наоборот, в классическом режиме проверка подлинности сначала выполняется с IIS 7.0 с использованием анонимного доступа, а затем с ASP.NET с использованием проверки подлинности с помощью форм.Таким образом, результатом проверки подлинности всегда является один пользователь - пользователь проверки подлинности с помощью форм.AUTH_USER / LOGON_USER возвращает этого же пользователя, поскольку учетные данные пользователя для проверки подлинности с помощью форм синхронизируются между IIS 7.0 и ASP.NET.

Побочным эффектом является то, что LOGON_USER, HttpRequest.LogonUserIdentity и олицетворение больше не могут получить доступ к учетным данным анонимного пользователя.что IIS 7.0 мог бы аутентифицироваться в классическом режиме.

Как настроить мой веб-сайт, чтобы он мог использовать правильную идентификацию с соответствующими разрешениями?

Я искал все ответы относительно этой конкретной проблемы, но пока не нашел ни одного ...

Надеюсь, вы поможете!

[ Bump ]

Ответы [ 2 ]

1 голос
/ 15 октября 2011

Итак, я наконец нашел решение своей проблемы.

Использование этой статьи базы знаний "Как реализовать олицетворение в приложении ASP.NET / Олицетворение конкретного пользователя в коде" Я нашелспособ олицетворения моего общего хостинга FTP-пользователь .

Таким образом, я бы получил привилегии указанного пользователя и не ставил под угрозу безопасность сервера, снижая безопасность на NT AUTHORITY \ NETWORK SERVICE пользователь.

Я использовал этот код:

using System;
using System.Runtime.InteropServices;
using System.Security.Principal;
using System.Configuration;

namespace App_Code
{
    public class Impersonation : IDisposable
    {
        private WindowsImpersonationContext _impersonationContext;

        #region Win32 API Declarations
        private const int Logon32LogonInteractive = 2; //This parameter causes LogonUser to create a primary token.
        private const int Logon32ProviderDefault = 0;

        [DllImport("advapi32.dll")]
        private 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)]
        private static extern int DuplicateToken(IntPtr hToken, int impersonationLevel, ref IntPtr hNewToken);

        [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern bool RevertToSelf();

        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        private static extern bool CloseHandle(IntPtr handle);
        #endregion

        public bool ImpersonateDefaultFtpUser()
        {
            return ImpersonateFtpUser(ConfigurationManager.AppSettings["ftpUsername"], ConfigurationManager.AppSettings["ftpDomain"], ConfigurationManager.AppSettings["ftpPassword"]);
        }

        public bool ImpersonateFtpUser(string userName, string domain, string password)
        {
            WindowsIdentity tempWindowsIdentity;
            var token = IntPtr.Zero;
            var tokenDuplicate = IntPtr.Zero;

            if (RevertToSelf())
            {
                if (LogonUserA(userName, domain, password, Logon32LogonInteractive, Logon32ProviderDefault, 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;
        }

        public void UndoImpersonation()
        {
            if (_impersonationContext != null)
                _impersonationContext.Undo();
        }

        /// <summary>
        /// Constructor. Impersonates the default ftp user. Impersonation lasts until
        /// the instance is disposed.
        /// </summary>
        public Impersonation()
        {
            ImpersonateDefaultFtpUser();
        }

        /// <summary>
        /// Constructor. Impersonates the requested user. Impersonation lasts until
        /// the instance is disposed.
        /// </summary>
        public Impersonation(string userName, string domain, string password)
        {
            ImpersonateFtpUser(userName, domain, password);
        }

        #region IDisposable Pattern

        /// <summary>
        /// Revert to original user and cleanup.
        /// </summary>
        protected virtual void Dispose(bool disposing)
        {
            if (!disposing) return;

            // Revert to original user identity
            UndoImpersonation();

            if (_impersonationContext != null)
                _impersonationContext.Dispose();
        }

        /// <summary>
        /// Explicit dispose.
        /// </summary>
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        /// <summary>
        /// Destructor
        /// </summary>
        ~Impersonation()
        {
            Dispose(false);
        }

        #endregion
    }
}
0 голосов
/ 14 января 2011

Можете ли вы дать пользователю Networkservice права на запись в рассматриваемые каталоги?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...