首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态数据安全修剪

动态数据安全修剪
EN

Stack Overflow用户
提问于 2013-04-03 03:17:21
回答 1查看 199关注 0票数 0

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

EN

回答 1

Stack Overflow用户

发布于 2013-04-05 04:49:24

至于动态数据中的安全实现,我想向你推荐一本很棒的书,由奥列格·赛奇写的“ASP.NET Dynamic Data Unleashed”。

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

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

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

List.aspx.cs (部分)

代码语言:javascript
复制
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 (部分)

代码语言:javascript
复制
<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 (部分)

代码语言:javascript
复制
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,以避免用户通过查询字符串访问不属于自己的记录。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15772480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档