【问题标题】:Ho do I show a button that links to a page only if the user is authorized to view that page? ASP.NET MVC如何仅当用户有权查看该页面时才显示链接到该页面的按钮? ASP.NET MVC
【发布时间】:2023-03-27 01:18:01
【问题描述】:

我有一个 ASP.NET MVC 项目。在这个项目中,用户可以登录我的网站。所有登录的用户都进入同一个页面登录页面。我的网站有一个单独的部分,然后仅针对某些用户进行划分。这在 Web.config 中由以下内容定义:

<location path="SectionedOff">
  <system.web>
    <authorization>
      <allow users="user1,user2,user3" />
      <deny users="*" />
    </authorization>
  </system.web>
</location>

如果用户被授权使用此部分,我想在页面上显示一个按钮,每个人在登录时都会被重定向到。这是我要完成的工作的粗略油漆图: 我已经完成了身份验证以及适当的授权,我只是不确定如何根据用户是否被授权访问网站的单独部分来显示和隐藏此按钮。我有一个偷偷摸摸的怀疑,我将不得不阅读 Web.config 文件以获取此信息,但是,我无法弄清楚如何在 Web.config 中的某个位置读取信息。任何帮助将不胜感激:)

【问题讨论】:

    标签: asp.net asp.net-mvc authorization


    【解决方案1】:

    web.config 文件中的&lt;authorization&gt; 部分用于保护虚拟文件和文件夹。它对 MVC 控制器和动作绝对没有影响(当然,除非动作试图访问物理文件)。

    保护 MVC 控制器和操作的正确方法是使用 AuthorizeAttribute。有关如何将其与 AllowAnonymous 属性结合使用的示例,请参阅 this post(推荐的方法是保护所有内容,除非您想退出,然后应用 AllowAnonymous 属性)。

    AuthorizeAttribute 依赖于IPrincipalIIdentity 接口。 Microsoft 的所有security frameworks(身份、成员资格等)都实现了这些接口,因此它们可以与AuthorizeAttribute 无缝协作。如果您有自定义安全框架,则应实现这些接口 - 请参阅 this answer

    一旦这些实现到位并作为 HttpContext 的一部分添加,检查用户是否登录以及他们是否处于特定角色就非常简单。

    @if (this.User.Identity.IsAuthenticated)
    {
        <input type="button" value="Go somewhere that requires logged in user" />
    }
    
    @if (new string[] { "user1", "user2", "user3" }.Contains(this.User.Identity.Name))
    {
        <input type="button" value="Go somewhere that requires user1, user2, or user3" />
    }
    
    @if (this.User.IsInRole("Admin"))
    {
        <input type="button" value="Go somewhere that requires an Admin role" />
    }
    

    或者,您可以使用MvcSiteMapProvider,当相应操作上的AuthorizeAttribute 没有权限时,它会自动隐藏菜单选项。

    免责声明:我是MvcSiteMapProvider 项目的主要贡献者。

    【讨论】:

    • 我其实已经有申请认证的Authorize属性了,可惜由于某些项目限制,无法开启roleManager。我可以像您在这里一样将用户保留在字符串数组中,但我真的希望有一种方法可以从 WebConfig 中获取它们,因为它们已经在该授权属性下定义了。
    • AuthorizeAttribute 不在 web.config 中。它继续你的控制器和动作。您正在应用 ASP.NET 安全性,但您需要使用 MVC 安全性(否则您实际上有 no 安全性)。
    • 我知道。它在每个控制器/每个动作结果上都需要打开。身份验证工作得很好,以及对页面的适当授权。只需将该按钮显示给那些被授权进入其他位置的人。
    【解决方案2】:

    你可以这样使用:

    if (User.IsInRole("Manager")) {}
    

    然后在if里面使用css类控制按钮的可见性。

    这是假设您设置了不同的角色。

    这种方法在我的项目中一直很有效。

    詹姆斯

    【讨论】:

    • 很遗憾,由于项目限制,我无法启用roleManager。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 2019-05-17
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多