Как динамически авторизовать пользователей в MVC внутри Application_Start - PullRequest
0 голосов
/ 11 декабря 2018

Я использую MVC 5 для создания приложения.В моем web.config я определил пользовательский раздел, который я буду использовать для отображения меню пользователю.Это что-то вроде:

<Menus>
    <Menu>
        <MainMenu Title="Home"></MainMenu>
        <SubMenus>
            <SubMenu Title="Page1" PageName="home/index" ADGroup="BusinessUsers">
            <SubMenu Title="Page2" PageName="home/index2" ADGroup="ITUsers">
        </SubMenus>
    </Menu>
    <Menu>
        <MainMenu Title="About Us"></MainMenu>
        <SubMenus>
            <SubMenu Title="Another Page1" PageName="about/mypage1" ADGroup="BusinessUsers">
            <SubMenu Title="Some Other Page" PageName="about/mypage2" ADGroup="OtherUsers">
        </SubMenus>
    </Menu>
</Menus>

Я использую аутентификацию Windows, и у всех будет доступ через группы AD.По умолчанию я запретил доступ всем пользователям, используя правило авторизации в web.config, как показано ниже:

<authorization><deny users="*"/></authorization>

Можно ли определить правила авторизации на основе вышеупомянутого МЕНЮ в Application_Start во время выполнения?Что-то вроде:

Global.Filters.AuthorizeUser("BusinessUsers", "home/index, about/mypage1");
Global.Filters.AuthorizeUser("ITUsers", "home/index2");

1 Ответ

0 голосов
/ 11 декабря 2018

То, что вы здесь делаете, не является стандартным способом определения меню, поэтому не существует стандартного способа применения авторизации для него.Вам нужно будет реализовать это самостоятельно.

Где-то в вашем коде во время запроса вам придется циклически проходить через каждое SubMenu и использовать HttpContext.Current.User.IsInRole("DOMAIN\\GroupName"), чтобы проверить, находится ли пользователь в соответствующей группе.Я не могу дать вам дальнейших указаний, чем это, не видя больше вашего кода.

Я уверен, что у вас есть причины для того, чтобы поместить это в web.config, но то, что я сделал в своих собственных проектах,определите меню в частичном представлении и проверьте роли прямо в представлении:

@if (HttpContext.Current.User.IsInRole("DOMAIN\\GroupName") {
<a href="/something">Some menu item</a>
}

Если вас беспокоит возможность обновления пунктов меню без перекомпиляции всего проекта, тогда все равно хорошо, так какФайлы cshtml все равно не компилируются - вы можете обновить их на лету.

...