Повышение привилегий в веб-приложении MVC3 с проверкой подлинности Windows

У меня есть требование реализовать повышение привилегий пользователя в веб-приложении MVC3 как для проверки подлинности Forms, так и для Windows, но этот вопрос имеет решающее значение для проверки подлинности Windows. Это делается для того, чтобы пользователь с более высокими привилегиями помогал пользователю с более низкими привилегиями, например. когда канцелярский пользователь выполняет задачу и требует, чтобы пользователь-администратор выполнил задачу, прежде чем канцелярский пользователь сможет продолжить, пользователь-администратор должен иметь возможность повысить тот же сеанс до своего уровня привилегий, выполнить задачу администратора и восстановить более низкую привилегию. к сеансу. Я не вижу здесь способа без выхода канцелярского пользователя и входа в систему пользователя-администратора, учитывая, что мы хотим добиться этого только на рабочем столе канцелярского пользователя. Возможно, переключение пользователей более аккуратно, чем целый новый сеанс, но мне бы очень хотелось, чтобы для веб-приложений с проверкой подлинности Windows был эквивалент «запуск от имени».

Возможно ли это, и если да, то как я могу этого добиться? Я понятия не имею, где даже начать искать.


person ProfK    schedule 26.05.2012    source источник


Ответы (4)


Вы можете поставить якорь где-нибудь на своем сайте:

@Html.ActionLink("elevate to admin", "SwitchToAdmin", "Home")

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

public ActionResult SwitchToAdmin()
{
    // TODO: Adjust the role name that your administrators will have
    if (!User.IsInRole(@"DOMAIN\Administrators"))
    {
        // The user is not currently an admin => popup a Logon box
        // so that the administrator could authenticate himself
        return new HttpUnauthorizedResult();
    }
    else
    {
        // After inputting the correct username and password for the
        // admin, we can now redirect to the home action and start performing
        // the admin tasks
        return RedirectToAction("index", "home");
    }
}

Процесс возврата будет обратным. У вас может быть ссылка, которая вызовет действие контроллера, которое выдаст 401, если пользователь является администратором, позволяя обычному пользователю ввести свое имя пользователя и пароль.

person Darin Dimitrov    schedule 29.06.2012
comment
Насколько я понимаю, проверка подлинности Windows использует текущего пользователя, вошедшего в систему, и не запрашивает учетные данные. По крайней мере, в моих приложениях MVC это работает именно так. Есть ли способ заставить его работать, как вы написали? Было бы полезно протестировать некоторые из моих приложений. - person Austin Thompson; 29.06.2012
comment
Когда вы вернете код состояния 401, браузер запросит учетные данные, позволяющие вам переключить текущего подключенного пользователя. Конечно, вы не можете контролировать всплывающее окно входа в систему, потому что оно зависит от браузера. - person Darin Dimitrov; 29.06.2012
comment
Это не работает для меня, я не получаю никаких подсказок. Я собираюсь исследовать это еще немного, но я хотел добавить, что не думаю, что это сработает для проблемы OP, потому что они используют аутентификацию форм и Windows, а часть аутентификации форм может взять на себя 401 в соответствии с этой страницей: weblogs.asp.net/jgalloway/archive/2011/04/28/ - person Austin Thompson; 29.06.2012

Разрешить «опытному пользователю» временно установить определенную роль для других пользователей и, например, установить срок действия роли с помощью DateTime.

person Matteo Migliore    schedule 26.05.2012
comment
Со ссылкой на этот ответ, как я могу предоставить доступ опытному пользователю на той же машине, не требуя от обычного пользователя выхода из системы? - person ProfK; 25.06.2012
comment
Вы можете уменьшить риск того, что администратор Адам назначит пользователю Бобу роль администратора, а затем Боб даст роль администратора Салли, заблокировав таблицу администраторов, пока Боб временно повышается. - person RickAndMSFT; 25.06.2012
comment
@RickAndMSFT Спасибо, но как Адам получает доступ к продвижению Боба на машине Боба? В этом суть моего вопроса. - person ProfK; 25.06.2012

Чтобы использовать аутентификацию Windows для этого, я думаю, вам понадобится:

  • Команда запускается от имени
  • Ярлык на рабочем столе пользователя для запуска другого входа в систему
  • Либо пакетный сценарий для запроса информации для входа пользователя, либо отдельная настольная программа для сбора информации (ярлык указывает на то, что вы выберете)
  • как только информация для командной строки run as будет готова, вы можете либо запустить браузер, либо пользовательскую программу со встроенным браузером.

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

Во всяком случае, это одно из возможных решений. Вы также можете попытаться придумать менее сложный способ решения бизнес-задачи. Возможно, сеанс удаленного рабочего стола для администратора?

person Austin Thompson    schedule 27.06.2012
comment
Вау, спасибо @Austin, я ценю ваш вклад; это тривиальное требование вашего дедушки, но я надеюсь, что вы правы, я могу найти более простое решение, чем встроенный браузер или удаленный сеанс. Дрожь мне бревнами. - person ProfK; 27.06.2012

Эквивалентом команды запуска от имени является использование олицетворения пользователя. Это запуск команд, требующих более высоких привилегий от имени другого пользователя. Это должно работать следующим образом: 1) Пользователь пытается получить доступ к привилегированным ресурсам. Веб-приложение обнаруживает это либо потому, что у него есть своего рода таблица всех задач, требующих более высоких привилегий, либо путем перехвата исключения безопасности, которое оно получает при попытке выполнить операцию. 2) Когда это обнаружено, вы выдаете «RequiresPrivilegesElevationException» (исключение, которое вы должны определить). Это исключение я поймал контроллером, который теперь знает, что он должен запрашивать у пользователя более высокие привилегии 3) контроллер запрашивает у пользователя пароль администратора (или пароль пользователя с более высокими привилегиями) 4) когда пользователь отправляет учетные данные (через https) учетные данные используется для создания контекста олицетворения, и все операции выполняются в этом контексте олицетворения.

Недостатком этого подхода является то, что учетные данные и повышение привилегий действуют только для одного обращения к серверу... для любого другого запроса пользователь вынужден повторно вводить учетные данные. НЕТ БЕЗОПАСНОГО СПОСОБА ИЗБЕЖАТЬ ЭТОГО из-за ограничений браузера безопасности

person Francesco Abbruzzese    schedule 30.06.2012
comment
Хорошая мысль, олицетворение пользователя — интересный подход. Еще один недостаток этого заключается в том, что тогда вы собираете их учетные данные на уровне приложения, а не система обрабатывает это за вас. - person Austin Thompson; 30.06.2012
comment
Вариантов не так много: либо у пользователя уже есть привилегия, и ему просто нужно подтвердить, что он хочет ее использовать, либо ему нужно предоставить учетные данные. Во втором случае авторизационный билет может быть создан как на клиенте, так и на сервере. 3 логических варианта!. случай 1 прост: просто сделайте то же самое, что я уже объяснил в своем ответе, не требуя новых учетных данных, а просто подтверждение (https, чтобы избежать поддельных подтверждений). Для создания заявки на клиенте в значительной степени требуется олицетворение на клиенте, а также требуется дополнительное программное обеспечение, добавленное в браузер. - person Francesco Abbruzzese; 01.07.2012