2

使用实体框架保护数据有哪些选项/解决方案?

我在这里不讨论表单登录等,只是假设用户是否经过身份验证。

为了说明,我附上了我的一个 web api 控制器,我想知道这是否是这样做的方法。我问的原因是我想知道是否有比将所有这些逻辑写入要在所有控制器中公开的数据更简单的方法。

此外,当研究像这样的系统时,我可以将 $expand=TrafficImages 添加到我的查询中,我不希望用户能够获得我的洞数据库。

总而言之,有什么方法可以保护暴露的数据,使用户无法下载敏感数据。

[AllowAnonymous]
public object GetTheoryTests()
{
    var identity = ((ClaimsIdentity)((ClaimsPrincipal)HttpContext.Current.User).Identity);
    //if (HttpContext.Current.User.Identity.IsAuthenticated)


   if (!identity.IsAuthenticated)
     return db.TheoryTests.Include(t=>t.TrafficImages).Where(t=>t.PublicAvalible)
            .Select(t => new { Id = t.Id, Title = t.Title, Images = t.TrafficImages }).AsEnumerable();

   if (User.IsInRole("WebAdmins"))
       return db.TheoryTests.AsEnumerable();

    var key = identity.GetProvider();

    var member = db.Members.Include(m=>m.PayedTheoryTests).SingleOrDefault(m=>m.Identities.Any(
        i=>i.identityprovider == key.provider &&
        i.nameidentifier == key.id));
        if(member!=null)
            return db.TheoryTests.Include(t => t.TrafficImages).Where(t => t.PublicAvalible).Select(t => new { Id = t.Id, Title = t.Title, Images = t.TrafficImages }).AsEnumerable();
        else
            return db.TheoryTests.Include(t => t.TrafficImages).Where(t => t.PublicAvalible)
                .Union(member.PayedTheoryTests).Select(t => new { Id = t.Id, Title = t.Title, Images = t.TrafficImages }).AsEnumerable();



}

考虑到它,我想念的是我的数据库中的视图模型,具体取决于用户的状态。在同一个数据库上创建两个实体框架,一个用于有限的数据显示,一个用于更高级的操作,是否是一种解决方案?

4

2 回答 2

3

同时,在 QueryInterceptors 到达之前,您应该采取其他步骤。首先,您应该研究保护 Web API 控制器或方法的技术,这个主题超出了本答案的范围。

其次,w/r/t $expand,你对这个特性保持警惕是完全正确的。您可能想要检查某些控制器方法请求哪些扩展和/或完全禁止其他方法。

幸运的是,这相对容易做到。您可以访问请求查询字符串。如果您想允许某些扩展并禁止其他扩展,您可以检测该字符串中是否存在“$expand”并对其进行分析。

Breeze 将来会为此添加助手。在此之前,您必须处理字符串。

如果您愿意,您可能希望为此创建自己的操作过滤器。

于 2012-10-30T15:26:37.363 回答
2

好问题!我们目前正在开发一种称为 QueryInterceptors 的东西,它允许您检查并可能更改或拒绝提交给服务器的查询。“主体”将是每个 QueryInterceptor 方法中的可用上下文对象。请在 www.breezejs.com 上的“Breeze”网站上投票支持此功能。

于 2012-10-29T21:01:33.540 回答