我在ASP.Net中有一个软件应用程序,我有不同的按钮和链接标签,每个按钮都有类,例如添加按钮有btnAdd作为他们的类,有些标签使用类似的类。 如果我想要控制级安全性,最好的方法是什么,例如,不允许ID = 2的用户点击某个ABC页面的AddNew按钮。
我的解决方案: 我有几个解决方案,例如将类的名称存储在表中并将该表与Pages Table链接并将数据带入隐藏文本字段,然后在页面加载时我们将检查是否允许此控件。就像允许btnAdd可见而btnSearch不可见。
假设我们以某种格式拥有隐藏字段的权限。但这样做是否是正确的做法?请提出一些更好的解决方案。
答案 0 :(得分: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()
}
当用户提交表单时,程序还会检查用户在服务器上的权限,以确保请求的有效性。即使攻击者设法找到一种偷偷摸摸的方式来执行他们不允许执行的功能,程序仍然可以通过检查返回的数据来限制攻击者执行所述操作,并验证用户实际上是否允许该功能
这相当于试图从银行取款 - 出纳员应该检查以确保您在向他们提供任何现金之前先在银行存款。
你不应该做什么
绝对不会依赖从客户端返回的隐藏字段或对象来确定托管变量结果。您应该始终假设从客户端发送的数据不安全或被篡改。运行检查,清理输入,并尝试验证客户端发送给您的所有内容是否正确。
执行操作权限之类的事情应该始终在服务器端检查,而不是其他任何事情。