Nano Hash - криптовалюты, майнинг, программирование

Загрузка файла не выполняется, когда пользователь аутентифицирован. Использование интегрированного режима IIS7

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

Выполнен вход: 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 при проверке подлинности с помощью форм

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

* 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 аутентифицировал бы в классическом режиме.

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

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

Я надеюсь, что вы можете помочь!

[Удар]


Ответы:


1

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

Используя эту статью базы знаний «Как реализовать олицетворение в приложении 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
    }
}
15.10.2011
  • Не могли бы вы рассказать поподробнее? У меня та же проблема, я попытался использовать свои учетные данные FTP внутри тега ‹identity›, но это не сработало. 10.08.2013
  • Это сработало отлично, мне просто нужно было создать экземпляр Impersonation i = new Impersonation("FTPusername","some.ip.address.v4","FTPpassword"); Спасибо! 21.08.2013

  • 2

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

    14.01.2011
  • Я отправил запрос в службу поддержки хостинговой компании относительно разрешений для идентификации сетевой службы. Я прокомментирую, когда получу ответ. 14.01.2011
  • Не переходите на разрешения для удостоверения сетевой службы. Это выходит за рамки их правил безопасности, что я могу понять. Есть ли другие предложения по решению? 07.02.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..