c# - 安全访问部分属性

标签 c# asp.net asp.net-mvc entity-framework .net-core

在我的应用程序中,我有两个角色(adminnormal)。在模型中我有类(示例):

public class Foo
{
    [Key]
    public int Id { get; set; }

    public string Name { get; set; }

    public string Extra { get; set; }
}

用户还可以编辑该对象并使用过滤器进行搜索。应用程序基于带有 EF Core 的 WebAPI ASP.NET Core。

要求 normal 不应该看到(或用它做任何事情)Extra 属性。我应该通过拆分模型类(或其他东西)来保护应用程序(服务、 Controller 、数据访问层)中各处的数据,还是通过忽略属性来格式化端点输出?

我的想法之一是创建一个属性,将其放在 Extra 属性上,然后使用 ContractResolver 在用户没有资格查看时忽略具有该属性的属性属性(property)。同时修改 EF 更改跟踪器以忽略保存该属性(在相同情况下)。

是否有任何模式或策略来处理该问题?

最佳答案

没有用于此的内置机制,不,因为它太细化了。此外,尝试在 EF 级别强制执行此操作意味着将 HttpContext 泄漏到 DAL 中,出于多种原因,这不是一个好主意。

我最好的建议是使用继承对其进行建模。换句话说,创建如下内容:

public class Foo
{
    [Key]
    public int Id { get; set; }

    public string Name { get; set; }
}

public class ExtraFoo : Foo
{
    public string Extra { get; set; }
}

默认情况下, Entity Framework 将通过单表继承来实现这一点,因此您的支持表看起来几乎完全相同。但是,这使您能够单独使用一个或另一个。

然后,我建议使用完全独立的 Controller 和/或操作来处理每种类型。这允许您为每个人使用不同的授权,确保“普通”用户只能使用 Foo(而不是 ExtraFoo)。为了消除这暗示的明显重复,您可以使用一个使用泛型的基本 Controller ,然后每个特定类型的 Controller 都可以从中继承:

public class BaseFooController<TFoo> : Controller
    where TFoo : Foo, new()
{
    // all your actions here, utilizing generic type, e.g.:

    [HttpPost]
    public ActionResult Create(TFoo foo)
    {
        ...
    }
}

[Authorize(Roles = "normal")]
public class FooController : BaseFooController<Foo>
{
}

[Authorize(Roles = "admin")]
public class ExtraFooController : BaseFooController<ExtraFoo>
{
}

关于c# - 安全访问部分属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44927638/

相关文章:

c# - 等待 100 毫秒以获取方法返回的数据 else throw exception

c# - C# .Net 上 MySQL 查询中的特殊字符

c# - ASP .Net Core Dto 和 Controller 到 typescript 类和接口(interface)

c# - 电话号码验证 MVC

c# - 选择列表的字典键和值

c# - 将包含多个项目的一种解决方案部署到一个 Azure WebJob

c# - 比较 Linq to Sql 中的可空类型

c# - 创建计划存储库,但在构造函数主体中使用关键字

asp.net - 如何从 @using (Html.BeginForm(

asp.net-mvc - ASP.NET MVC 路由参数不适用于区域