动态数据安全修整

时间:2013-04-02 19:17:21

标签: asp.net asp.net-dynamic-data

使用动态数据时,有一种方法只允许用户查看包含其名称/ ID#的记录。这意味着当他们过滤数据时,只显示他们的信息,而不是每个用户。

1 个答案:

答案 0 :(得分:1)

关于在动态数据中实施安全性,我想向您推荐Oleg Sych出版的一本好书 ASP.NET动态数据释放

至于您的情况,据我所知,您需要在 List.aspx 页面的 GridView 中显示仅包含当前登录用户的ID或名称的记录。

让我们考虑解决问题的最简单方法,保持动态数据方法。

让我们假设,在不考虑用户如何访问您的动态数据网站的情况下,我们在 List.aspx 后面的代码中有用户 ID 。为简单起见,假设我们的表包含用户 Id

List.aspx.cs (部分)

public partial class List : System.Web.UI.Page
{
    protected int userId;

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            userId = GetLoggedUser();  
        }        
    }
}

然后我们应该使用特殊的非可视控件 QueryExtender 并使用TargetControlID属性将它与基于LINQ的数据源控件相关联(假设在这种情况下我们有EntityDataSource)。

List.aspx (部分)

<asp:GridView 
    ID="gvTest" 
    runat="server" 
    DataSourceID="DetailsDataSourceTest"
    AllowPaging="true" 
    AllowSorting="false" 
    PageSize="10" 
    CssClass="gridview" 
    AutoGenerateColumns="false">
<Columns>
    <asp:DynamicField DataField="UserId" />
    <asp:DynamicField DataField="Col1" />
    <asp:DynamicField DataField="Col2" />
    <asp:DynamicField DataField="Col3" />
</Columns>
</asp:GridView>
<asp:EntityDataSource 
    ID="DetailsDataSourceTest" 
    runat="server"
    ConnectionString="name=TestEntities" 
    DefaultContainerName="TestEntities"
    EnableFlattening="false"
    EntitySetName="TableTestName" />
<asp:QueryExtender 
    ID="QueryExtenderTest" 
    runat="server"
    TargetControlID="DetailsDataSourceTest">
<asp:CustomExpression OnQuerying="QueryExtenderTest_Querying" />
</asp:QueryExtender>

如您所见,我们使用 QueryExtender 控件的 CustomExpression 选项,然后将 OnQuerying 属性设置为 QueryExtenderTest_Querying 。这将允许我们执行自定义 LINQ查询。

List.aspx.cs (部分)

protected void QueryExtenderTest_Querying(object sender, System.Web.UI.WebControls.Expressions.CustomExpressionEventArgs e)
{
    if (/* check userId if you would like */)
    {
        e.Query = (from c in e.Query.Cast<TableTestName>()
                    where (c.UserId == userId)
                    select c);
    }
}

了解更多信息:

Walkthrough: Filtering Data in a Web Page Using Declarative Syntax

修改

基于它的简单解决方案并依赖于在动态数据站点中实现路由,您应该在Details.aspx页面和Edit.aspx页面上使用自定义LINQ,以便用户无法通过查询字符串访问不自己的记录。