Framework средство управления ролями
Версия 2.0 и все последующие версии Framework не включают в себя предыдущие версии 1.0 и 1.1, не требуют и не заменяют их при установке. Последняя версия, поддерживающая Windows 98/ME (все существующие обновления для этой версии, а также для версий 1.0 SP3 и 1.1 SP1 с этими ОС несовместимы, при проблемах установки сервис паков для версий 1.0 и 1.1 под Windows 98/ME использовать ключ /q). Эта версия входит в состав операционных систем Windows Server 2003 R2SP1 / R2SP2 и Windows Vista.
Версия 3.0 SP2 не включает в себя версию 2.0 SP2, но требует ее для установки. Скачиваемый по ссылке неофициальный дистрибутив включает обе этих версии для x86 и x64 систем. Русский языковой пакет для версии 3.0 SP2 в дистрибутив не входит и отдельно не распространяется. При установке на чистую систему может потребоваться компонент Microsoft Core XML Services 6.0 aka MSXML 6.0 Parser (включен в дистрибутив). Эта версия входит в состав операционных систем Windows Vista SP2, Windows Server 2008 SP2 / R2 и Windows 7.
Версия 3.5 SP1 включает в себя версии 2.0 SP2 и 3.0 SP2. В начале установки делает попытку соединения с интернетом для закачки языкового пакета. Если этот пакет у вас уже имеется, установку следует производить будучи отключенным от сети. После нескольких неудачных попыток подключения установка продолжится в обычном режиме. Эта версия входит в состав операционных систем Windows 7 и Windows Server 2008 R2.
Версия 4 не включает в себя предыдущие версии (1.0, 1.1, 2.0, 3.0, 3.5), не требует их наличия при установке и не заменяет их.
Версия 5.0 не включает в себя предыдущие версии, не требует и не заменяет их при установке.
Версия 6.0 не включает в себя предыдущие версии, не требует и не заменяет их при установке.
Win 7x64
Дата установки: 23.06.2010 10:33
Состояние установки: Успех
Способ обновления: Важное
2а)потом распаковать его командой (имя .exe архива, ключ -x, имя каталога, enter)
2б)или просто запустить его, и, пока он запущен, скопировать то, что распаковалось из него в каталог в корневухе диска, на котором больше всего свободного места, в другой отдельный каталог. Потом согласиться с отказом в установке.
3)и запустить из распакованного варианта не exe-шник, а файл .msp - он нормально установится.
проверил - работает правда, в случае с сетями из сотен клиентских машин это опять гемор - надо как-то оптимизировать
Конфигурация: ноутбук dv6 2090er, процессор i7 720, Windows Server 2008 R2 x64 Datacentre, установлены все рекомендуемые пакеты обновления.
В предыдущей статье мы применили атрибут Authorize для класса контроллера Account, который ограничивает допуск к методам действий для неавторизованных пользователей. В этой статье я покажу вам, как доработать систему авторизации, чтобы осуществить более полный контроль над тем, какие действия можно выполнять определенным пользователям. По традиции, я составил список из трех вопросов, которые у вас сразу могут возникнуть:
Авторизация - это процесс предоставления доступа к контроллерам и методам действий для определенных пользователей, как правило, находящихся в определенных ролях (например, допуск к админке должны иметь только администраторы).
Зачем нужно использовать?
Без авторизации вы сможете различать только две категории пользователей: прошедшие и не прошедшие аутентификацию. Большинство приложений имеют список ролей, таких как: пользователь, модератор, администратор и т. д.
Как использовать в рамках MVC?
Роли используются для реализации авторизации через атрибут Authorize, который применяется к контроллерам и методам действий.
Добавление поддержки ролей
Уникальный идентификатор роли.
Возвращает список объектов IdentityUserRole, представляющих пользователей, которые находятся в данной роли.
Мы не будем использовать напрямую объекты IdentityRole в нашем приложении, вместо этого добавьте файл класса AppRole.cs в папку Models со следующим содержимым:
Класс RoleManager<T> работает с экземплярами IRole с помощью методов и свойств, перечисленных в таблице ниже:
Создает новую роль
Удаляет указанную роль
Поиск роли по идентификатору
Поиск роли по названию
Возвращает true, если существует роль с указанным именем
Сохраняет изменения в указанной роли
Список существующих ролей
Эти базовые методы реализуют тот же базовый шаблон, который использует класс UserManager<T> для управления пользователями. Добавьте файл AppRoleManager.cs в папку Infrastructure со следующим содержимым:
Этот класс определяет статический метод Create(), который позволит OWIN создавать экземпляры класса AppRoleManager для всех запросов, где требуются данные Identity, не раскрывая информации о том, как данные о ролях хранятся в приложении. Чтобы зарегистрировать класс управления ролями в OWIN, необходимо отредактировать файл IdentityConfig.cs, как показано в примере ниже:
Это гарантирует, что экземпляры класса AppRoleManager используют тот же контекст базы данных Entity Framework, что и экземпляры AppUserManager.
Создание и удаление ролей
Мы подготовили базовую инфраструктуру для работы с ролями, давайте теперь создадим средство администрирования для работы с ролями. Сначала давайте определим методы действия и представления для управления ролями. Добавьте контроллер RoleAdmin в проект приложения с кодом, показанным в примере ниже:
Здесь мы применили многие из тех приемов, что использовали в контроллере Admin, в том числе добавили свойства UserManager и RoleManager для более быстрого запроса объектов AppRoleManager и AppUserManager. Также мы добавили аналогичный метод AddErrorsFromResult(), который обрабатывает ошибки в объекте IdentityResult и добавляет их в метаданные модели.
Представления для контроллера RoleAdmin содержат простую HTML-разметку и операторы Razor. Нам необходимо отобразить не только список ролей, но и имена всех пользователей, входящих в каждую роль. Класс IdentityRole определяет свойство Users, которое возвращает коллекцию объектов IdentityUserRole, описывающих пользователей роли. Каждый объект IdentityUserRole имеет свойство UserId, которое возвращает уникальный идентификатор пользователя, с помощью которого мы будем получать имя пользователя.
Добавьте файл класса IdentityHelpers.cs в папку Infrastructure со следующим содержимым:
Следующий пример показывает содержимое файла Index.cshtml, находящегося в папке /Views/RoleAdmin:
В этом представлении отображается список ролей, определенных в приложении, вместе со списком пользователей в каждой роли. На данный момент мы еще не создали ни одной роли:
Следующий пример содержит представление Create.cshtml в той же папке, которое используется для создания новых ролей:
Единственная информация, которая требуется для создания новой роли - ее название. Поэтому мы добавили один стандартный элемент <input> и кнопку отправки формы POST-методу действия Create.
Чтобы протестировать функционал создания ролей, запустите приложение и перейдите по адресу /RoleAdmin/Index в окне браузера. Чтобы создать новую роль нажмите кнопку «Создать», введите имя в поле ввода в появившейся форме и нажмите вторую кнопку «Создать». Новое представление будет отображать список ролей, сохраненных в базе данных:
Вы можете также удалить роль из приложения нажав кнопку «Удалить».
Редактирование ролей
Для авторизации пользователей недостаточно просто создавать и удалять роли. Мы также должны уметь управлять ролями, назначать и удалять пользователей из роли. Это не сложный процесс, но для его реализации нам необходимо загружать данные о ролях с помощью класса AppRoleManager, а затем вызывать методы, определенные в классе AppUserManager на объектах, связанных с определенной ролью.
Давайте начнем с добавления новых классов модели-представления (view-model) в файл UserViewModels.cs:
Класс RoleEditModel содержит информацию о роли и определяет список пользователей в роли в виде коллекции объектов AppUser. Благодаря этому, мы сможем извлечь ID и имя каждого пользователя в роли. Класс RoleModificationModel будет получать данные от системы привязки модели во время редактирования данных пользователя. Он содержит массив идентификаторов пользователей, а не объектов AppUser, для замены ролей.
Определившись с классами моделей, давайте добавим методы редактирования ролей Edit в контроллер RoleAdmin:
Большая часть кода в GET-версии метода Edit отвечает за формирование списков пользователей входящих и не входящих в роль и реализуется с помощью методов LINQ. После группировки пользователей возвращается представление, которому передается объект RoleEditModel.
POST-версия метода Edit отвечает за добавление и удаление пользователей из ролей. Класс AppUserManager наследует ряд вспомогательных методов для работы с ролями из класса UserManager<T>. Эти методы перечислены в таблице ниже:
Добавляет пользователя с указанным идентификатором id в роль с указанным именем name
Возвращает список из имен ролей, в которых находится пользователь с идентификатором id
Вернет true, если пользователь с указанным идентификатором id является членом роли с именем name
Удаляет пользователя с указанным id из роли с указанным именем name
Странность этих методов заключается в том, что они работают с идентификатором пользователя и именем роли, хотя каждая роль также имеет свой уникальный идентификатор. Именно поэтому класс RoleModificationModel содержит строковое свойство RoleName.
В примере ниже показан код представления Edit.cshtml, находящегося в папке /Views/RoleAdmin.cshtml:
Представление содержит две таблицы: со списком пользователей входящих и не входящих в текущую роль, открытую для редактирования. Напротив каждого пользователя стоит флажок, который позволяет изменить его членство в данной роли.
Давайте протестируем функциональность редактирования ролей. Добавление класса AppRoleManager в архитектуру OWIN заставит Entity Framework удалить базу данных и воссоздать новую схему. Это означает, что пользователи, которых мы создали ранее исчезнут. Поэтому после запуска приложения перейдите по адресу /Admin/Index и создайте нескольких пользователей.
Чтобы проверить редактирование ролей, перейдите по адресу /RoleAdmin/Index и создайте несколько ролей, затем отредактируйте эти роли, добавив в них нескольких пользователей. На рисунке ниже показан пример приложения (я создал роль Users):
Нажмите на кнопке сохранить и перейдите в представление /RoleAdmin. Вы увидите список созданных ролей и список пользователей в каждой роли, как показано на рисунке ниже:
Использование ролей для авторизации
Теперь, когда у нас есть возможность управления ролями, мы можем использовать их в качестве основы для авторизации через атрибут Authorize. Чтобы проще было тестировать процесс авторизации, давайте добавим метод действия для выхода пользователя из системы в контроллер Account, как показано в примере ниже:
Давайте обновим контроллер Home и добавим новый метод действия, который будет передавать информацию об аутентифицированном пользователе в представление:
В заключение, нам необходимо добавить кнопку выхода из приложения в представление Index.cshtml из папки /Views/Home:
Атрибут Authorize может быть также использован для настройки авторизации на основе списка пользователей. Данную возможность удобно использовать в небольших проектах, но это создаст трудности при расширении приложения, т. к. каждый раз потребуется изменять код в контроллере, когда будет добавляется новый пользователь. Использование ролей для авторизации изолирует приложение от изменений в учетных записях отдельных пользователей и контролирует доступ к приложению через членство ролей.
Для тестирования системы авторизации, запустите приложение и перейдите по адресу /Home/Index. Браузер будет перенаправлен на страницу входа в приложение, где вы должны будете ввести данные существующей учетной записи. Метод действия Index является доступным для любого авторизованного пользователя. Однако если вы перейдете по адресу /Index/OtherAction, доступ будет открыт только тем пользователям, которые являются членами роли Users.
Если вы попытаетесь войти под пользователем, находящимся в другой роли, то браузер перенаправит вас снова на форму входа в приложение. Перенаправление уже аутентифицированных пользователей на страницу входа является малополезным решением, поэтому давайте отредактируем контроллер Account и добавим возможность перенаправления аутентифированных пользователей, не прошедших авторизацию, на страницу ошибки:
На рисунке ниже наглядно показано поведение нашего приложения, когда пользователю отказано в доступе:
В обычном случае, установка вышеупомянутого фреймворка осуществляется силами ОС и, по сути, представляет из себя лишь включение компонента, отключенного по умолчанию.
После чего ОС подключается к серверу обновлений, скачивает необходимые файлы, и устанавливает компонент.
В ряде случаев ОС не может скачать нужные файлы, а именно:
Решение проблемы
Решением проблемы является установка вышеобозначенного компонента из локальных источников. Для начала необходимо определиться с локальным хранилищем пакетов. Вообще-то, оно находится на установочном диске Windows 8, в директории \sources\sxs, но, во-первых, не всегда под рукой есть диск (или iso), во-вторых, установка с первого же попавшегося диска почему-то не прошла, но прошла с другого. Чтобы избежать этих проблем, я подготовил архив со всеми необходимыми файлами. Итак приступим.
- Скачиваем архив с файлами, необходимыми для установки компонента: Sources.zip (102.5 MB)
- Распаковываем архив, для наглядности я распаковал его в корень диска C:\
- Запускаем командную строку с правами администратора
- Выполняем код, с учетом пути к распакованным файлам из архива:
DISM /Online /Enable-Feature /FeatureName:NetFx3 /All /LimitAccess /Source:C:\Sources\sxs
Update от 01.02.2019
Спустя годы ситуация изменилась, подробное обсуждение доступно на форуме Microsoft.
Теперь никаких локальных установок не нужно. Достаточно поставить одну галочку в GPO.
Computer Configuration > Administrative Templates > System, "Specify settings for optional component installation and component repair"
Или по-русски:
Конфигурация компьютера - Политики - Административные шаблоны - Система - Укажите параметры для установки необязательных компонентов и восстановления компонентов.
Галка "Скачайте содержимое для восстановления и дополнительные компоненты непосредственно из Центра обновлений Windows. "
Достаточно большое количество программ написано под эту платформу, поэтому нужно знать, как установить ее на сервер.
Вариант 1
Запускаем PowerShell с правами администратора: Пуск — правый клик по ярлыку Windows Powershell — Запуск от имени Администратора (Run as Administrator):
В открывшемся окне PowerShell набираем команду:
DISM /Online /Enable-Feature /FeatureName:NetFx3 /All
Eсли установка производится на Windows Server 2008R2:
DISM /Online /Enable-Feature /FeatureName:NetFx3
Нажимаем Enter и ожидаем завершения установки:
Вариант 2
Для установки с использованием локального хранилища (или дистрибутива ОС Windows) через графический интерфейс (Windows Server 2012R2/2016/2019 ):
Запускаем Диспетчер серверов (Server Manager), нажимаем Управление (Manage) – Добавить роли и компоненты (Add Roles and Features):
В появившемся окне нажимаем Далее (Next):
В окне Выбор типа установки (Select installation type) убеждаемся, что выбран пункт установка ролей и компонентов (Role-based or feature-based installation), нажимаем Далее (Next):
Выбор целевого сервера (Select destination server) – проверяем, что в списке выбран требуемый сервер, нажимаем Далее (Next):
Пропускаем Выбор ролей сервера (Select server roles), нажимаем Далее (Next):
В открывшейся форме указываем путь к папке SourcesSxS дистрибутива текущей версии (или копии этой папки – в нашем примере папка скопирована на локальный диск в c:tempsxs), нажимаем ОК:
Вернувшись на форму Подтверждение компонентов установки (Confirm installation selections) нажимаем Установить (Install) и ожидаем окончания установки. Закрываем форму:
Установка на Windows server 2008R2 также производится через Диспетчер серверов:
Запускаем Диспетчер серверов, переходим в раздел Компоненты, нажимаем Добавить компоненты:
Читайте также: