ASP. NET MVC Олицетворение не работает с проверкой подлинности с помощью форм - PullRequest
2 голосов
/ 07 февраля 2020

Я пытаюсь запустить этот код:

File.WriteAllText(FilePath + Description + "-" + ID + ".txt", FileContent);

Но не могу, если я не выдаю себя за пользователя. В моем файле web.config для олицетворения установлено значение true, если я установил учетные данные там, эта строка кода работает, как ожидалось.

<identity impersonate="true" userName="domain\username" password="password" />

Это не работает:

<identity impersonate="true" />

Когда Я запускаю этот код:

System.Security.Principal.WindowsIdentity.GetCurrent()

Я вижу, что он заполнен с правильным именем пользователя и для олицетворения установлено значение true.

Итак, почему эта строка кода не работает , когда мой пользователь может выдать себя за другого?

File.WriteAllText(FilePath + Description + "-" + ID + ".txt", FileContent);

ПОЖАЛУЙСТА, ПОМОГИТЕ!

ОБНОВЛЕНИЕ

Это мой метод входа, который я использую для входа в систему против активный каталог.

[HttpPost]
public ActionResult Index(Login model, string returnUrl)
{
    if (!ModelState.IsValid)
    {

        ModelState.AddModelError("", "The user name or password provided is incorrect.");

        return View(model);
    }

    if (Membership.ValidateUser(model.UserName, model.Password))
    {
        FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
        if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
            && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
        {
            return Redirect(returnUrl);
        }

        return RedirectToAction("Index", "Home");
    }

    ModelState.AddModelError("", "The user name or password provided is incorrect.");

    return View(model);
}

Ответы [ 4 ]

2 голосов
/ 10 февраля 2020

Сосредоточив внимание на вопросе: Итак, почему эта строка кода не работает ...

В этом и заключается смысл отсутствия имитации или наличия ее с или без пользователя / пароля:

  • Impersonation is disabled

    Идентификатор пула приложений используется для запуска кода приложения.

  • <identity impersonate="true"/>

    IUSR используется для запуска кода приложения.

  • <identity impersonate="true" userName="accountname" password="password"/>

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

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

Чтобы решить эту проблему:

  • Вы можете предоставить IUSR с дополнительными разрешениями.
  • Или вы можете захотеть выполнить олицетворение, указав имя пользователя и пароль, которые имеют достаточно разрешений в конфигурации или в коде
  • . Или вы можете запустить приложение под идентификатором пула приложений, у которого есть достаточно прав.
  • Или вы можете использовать встроенную Windows аутентификацию и настройку для делегирования, как объяснено здесь .

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

1 голос
/ 11 февраля 2020

Рассмотрим олицетворение windows для работы с аутентификацией. Как пользователь Windows, доступ к частным ресурсам является более приоритетным и доступным, чем веб-пользователь. В этом случае по умолчанию невозможно эмулировать пользователя IIS.

Кроме того, всегда есть решение. В прошлом мы импортировали dll в windows, чтобы решить эту проблему. Теперь я помещаю защищенный сертификат в мое основное приложение. net. Вы можете получить доступ к активному каталогу, как эта реализация. Который я достигаю для машин redis.

        services.AddDataProtection().ProtectKeysWithDpapi(protectToLocalMachine: true);

        services.AddDataProtection()
            .ProtectKeysWithCertificate(
                new X509Certificate2(Path.Combine(Directory.GetCurrentDirectory(), "clientCert.pfx"), "password",
                 X509KeyStorageFlags.MachineKeySet
                         | X509KeyStorageFlags.PersistKeySet
                         | X509KeyStorageFlags.Exportable)
            )
            .UnprotectKeysWithAnyCertificate(
                new X509Certificate2(Path.Combine(Directory.GetCurrentDirectory(), "clientCert.pfx"), "password",
                            X509KeyStorageFlags.MachineKeySet
                         | X509KeyStorageFlags.PersistKeySet
                         | X509KeyStorageFlags.Exportable
                )
            );

        services.Configure<StorageConfiguration>(new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).Build());
        var redisConf = Configuration.GetSection("RedisConnection").Get<RedisConnection>();
        ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(redisConf.Host.ToString() + ":" + redisConf.Port.ToString());
        services.AddDataProtection().PersistKeysToStackExchangeRedis(redis, "DataProtection-Keys");
        services.AddSingleton<IConnectionMultiplexer>(ConnectionMultiplexer.Connect(redisConf.Host.ToString() + ":" + redisConf.Port.ToString()));

IIS сторона должна быть определена как анонимный и интегрированный пользователь. И этот код предоставит вам доступ к специальным ресурсам

0 голосов
/ 11 февраля 2020

Какой браузер вы используете для проверки этого? Edge и Chrome должны автоматически передавать учетные данные Windows в ваше приложение, но в Firefox вам нужно изменить параметр about: config, для этого ответа: https://superuser.com/questions/29624/how-can-i-make-firefox-behave-like-ie-on-a-windows-domain-when-requesting-user-c

0 голосов
/ 10 февраля 2020

Убедитесь, что IUSR или учетная запись, на которой запущен пул приложений, имеет доступ на чтение / запись к папке FilePath.

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