【问题标题】:How to dynamically authorize users in MVC inside Application_Start如何在Application_Start内的MVC中动态授权用户
【发布时间】:2019-05-12 15:48:06
【问题描述】:

我正在使用 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中的MENU定义授权规则?比如:

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

【问题讨论】:

  • 那在你的 web.config 中?你的代码在哪里把它从你的 web.config 中拉出来并放到你的视图中?这可能是您必须这样做的地方。
  • 这就是我要问的,即如何在运行时授权用户。我需要在Application_Start 中编写的代码是什么,以根据&lt;Menu&gt; 中定义的 AD 组授权各个用户
  • 我在问一些不同的问题。暂时忘记授权。您如何从您的 web.config 中读取此内容并将其置于您的视图中?
  • 如果您想在运行时进行细粒度授权,您需要研究一个框架,该框架可以在 .NET 甚至 XACML 或 ALFA 中执行基于声明的 AuthZ。
  • @GabrielLuci 我正在使用ConfigurationSettings.GetConfig 阅读菜单,然后循环浏览其中的所有记录。

标签: asp.net-mvc-5 active-directory asp.net-authorization role-base-authorization


【解决方案1】:

您在此处所做的不是定义菜单的标准方式,因此没有对其执行授权的标准方式。您需要自己实现它。

在请求期间在代码中的某处,您将不得不遍历每个 SubMenu 并使用HttpContext.Current.User.IsInRole("DOMAIN\\GroupName") 来测试用户是否在适当的组中。在没有看到更多代码的情况下,我无法为您提供任何进一步的指导。

我确定您有理由将其放入 web.config,但我在自己的项目中所做的是在部分视图中定义菜单并在视图中检查角色:

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

如果您担心能够在不重新编译整个项目的情况下更新菜单项,那么这仍然可以,因为无论如何都不会编译 cshtml 文件 - 您可以即时更新它。

【讨论】:

  • 我可以很好地显示菜单。它只是简单的 HTML 菜单,带有主项和子菜单。我的问题是当用户单击任何子菜单时,他将收到拒绝访问错误。现在我想要的是在运行时通过授权以某种方式让该用户访问该页面。否则我知道一种方法是在 web.config 中定义 location 但这意味着我必须在两个地方定义它;一个菜单和第二个这个位置。我希望一切都在一个地方完成,即我在 web.config 中的自定义菜单
  • "这只是简单的 HTML 菜单" - 它是如何变成这样的?您是否在应用程序加载时处理它?
猜你喜欢
  • 2011-01-24
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
  • 2014-06-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多