0

我在 ASP.Net 中有一个软件应用程序,我有不同的按钮和链接标签,每个按钮都有类,例如添加按钮有 btnAdd 作为它们的类,并且一些标签使用类似的类。如果我想要控制级别的安全性,最好的方法是什么,例如不应允许 ID = 2 的用户单击某些 ABC 页面的 AddNew 按钮。

我的解决方案:我有几个解决方案,例如将类的名称存储在一个表中并将该表与 Pages Table 链接并将数据带入隐藏文本字段,然后在页面加载时,我们将检查是否允许此控件或不是。就像 btnAdd 允许可见而 btnSearch 不可见。

请找到所附图片以进行进一步说明。 在此处输入图像描述

假设我们在某种格式的隐藏字段中拥有权限。但这会是这样做的正确方法吗?请提出一些更好的解决方案。

4

1 回答 1

1

使用 Razor 生成按钮

您可以构建 Razor 视图以合并包含用户权限的视图模型。然后,您可以根据用户是否有权执行该操作将每个按钮添加到页面。

假设您的模型(我们将其称为Users)包含一个权限集,您可以通过Users.UserPermissions. 您的UserPermissions属性可能有一个CanAdd和一个CanSearch布尔值。您将使用数据库中有关相关用户的数据填充此模型,然后像这样呈现页面:

<div class="container">
    @{
        if (Model.UserPermissions.CanAdd)
        {
            <button class="add">Add</button>
        }

        if (Model.UserPermissions.CanSearch)
        {
            <button class="search">Search</button>
        }
    }
</div>

然后在服务器端检查您的权限

这意味着只有在用户有权执行该操作时,该按钮才会被添加到界面中。

[HttpPost]
public ActionResult Index(UserViewModel model)
{
    var user = User.GetByEmail(userEmail);

    if (user.CanAdd)
    {
        myClass.Add(model.ThingsToAdd);
    }

    if (user.CanSearch)
    {
        myClass.Search(model.ThingsToSearchFor);
    }

    return View()
}

当用户提交表单时,程序还会检查用户在服务器上的权限,以确保请求的有效性。即使攻击者设法找到一种偷偷摸摸的方法来执行他们不被允许执行的功能,程序仍然可以通过检查返回的数据并验证用户是否真的被允许执行该功能来限制攻击者执行所述操作.

这相当于试图从银行取款 - 出纳员应该先检查以确保您在银行里有一些钱,然后再给您任何现金。

你不应该做的事

绝对不要依赖从客户端返回的隐藏字段或对象来确定托管变量结果。您应该始终假设从客户端发送的数据是不安全的或被篡改的。运行您的检查,清理您的输入,并尝试验证客户发送给您的所有内容都是真实的。

诸如执行操作的权限之类的事情应该始终在服务器端进行检查,而不是其他任何事情。

于 2018-01-04T14:17:36.460 回答