ASP.NET:基于角色的安全性和页面设计

时间:2009-12-20 04:17:42

标签: asp.net security roles application-design

我有一个带有几个网格的页面和一个带有7个控件的小表单。网格显示辅助数据。总体而言,大约有320行代码隐藏处理各种事件。我要求一个特定角色只能编辑7个中的3个字段,而所有其他可以访问此页面的角色都可以编辑所有这些字段。

现在回答我的问题。我们通常采用这种方法将基于角色的安全性限制到页面级别,因为通过这样做,.Net中的安全性变得完全可配置。但在这种情况下,由于这个要求,我即将出现例外,这是我没有模式的新领域。我只需要为只能访问3个控件的角色创建单独页面就必须执行的代码重复量使得这不是一个选项 - 即使我将一些内容放入用户控件中,这似乎是不合理的工作量反正。

我的第一个想法是禁用page_load事件中当前用户无法访问的所有控件,但这感觉很难看。有没有更好的方法呢?

3 个答案:

答案 0 :(得分:2)

您可以对要保护的控件类型进行子类化,并在OnLoad事件中确定是否允许用户进行编辑。

public class ProtectedTextBox : TextBox
{
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        bool hasAccess = CurrentUserHasAccess(); // TODO
        if (hasAccess)
        {
            Enabled = true;
        }
        else
        {
            Enabled = false;
        }
    }
}

然后在web.config中为控件分配前缀:

<pages>
    <controls>
        <add tagPrefix="me" Namespace="YourNamespace" assembly="YourAssembly" />
    </controls>
</pages>

最后,只需在您的页面上使用它代替您希望阻止未经授权的用户修改的任何字段的常规TextBox。

<me:ProtectedTextBox runat="server" <!-- etc. -->>

对Buttons以及您需要的任何其他控件类型执行相同的操作。

答案 1 :(得分:0)

如果您创建了另一个也从文件后面的相同代码继承的表单,该怎么办?这会不会给你一个不同的视图,并阻止你形成重复的代码?

答案 2 :(得分:0)

您是否可以安排控件以使受安全性影响的控件位于单独的面板中,然后根据安全性隐藏面板?