2

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

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

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

4

3 回答 3

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. -->>

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

于 2010-02-17T17:41:08.820 回答
0

如果您制作了另一个也继承自相同代码隐藏文件的表单怎么办?这不会给你一个不同的观点并防止你形成重复的代码吗?

于 2009-12-20T04:24:10.890 回答
0

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

于 2009-12-20T05:05:56.060 回答