如何安全地使用 MVC WebAPI OData 端点?
Posted
技术标签:
【中文标题】如何安全地使用 MVC WebAPI OData 端点?【英文标题】:How to use a MVC WebAPI OData endpoint securely? 【发布时间】:2013-12-16 02:27:45 【问题描述】:我在~/odata/
定义了一个 OData 端点,除非用户已通过身份验证,否则不需要访问该端点(事实上,您将如何保护未经身份验证的用户)。
我在 web.config 中为此路径设置了基于角色的身份验证:
<location path="odata">
<system.web>
<authorization>
<allow roles="WaitConfirmation, etc...."/>
</authorization>
</system.web>
</location>
当用户登录时,我不使用 OData 端点进行身份验证(主要是因为我需要弄清楚如何保护它)。
我使用 EntityFramework 来验证用户、返回用户对象并补充成员资格/角色详细信息。
这是允许用户的数据调用通过 WebAPI 路径的标准方法吗?如果是,您如何确保任何请求 WebAPI 请求(记住,我使用的是 OData)只返回与登录用户?
我只阅读了有关通过装饰控制器方法(即[Queryable(PageSize=10)]
)来“保护” OData 服务以限制 DOS 攻击等的内容,但没有阅读如何确保一个通用参数(即。 UserID=[this logged in user id]
) 不包括在内,以将其包括在所有 EF 请求中。
【问题讨论】:
【参考方案1】:在您的 API 层,您希望实施允许您生成声明的授权方案。对于 Web API,如果您为此使用 Web API 2.0,则可以使用新的 OAuth 2.0 OWIN 中间件。虽然没有很好的文档记录,但使用起来相当简单。
然后,您希望实现一个服务层,该层根据有关访问它的身份的声明(例如角色或其他类型的声明信息)来处理授权规则。您可以将声明主体或类似对象从 API 层传递到服务层,如果获得授权,您需要在代码的较低级别进行进一步审核,您始终可以将声明主体作为“用户上下文”传递。
在您的服务层中,您通常希望采用一种方法,即拥有一个授权管理器或类似的方法,将授权逻辑的评估和执行转移到一个中心位置,同时以声明方式定义您的授权规则 - 看看这个文章了解更多:http://visualstudiomagazine.com/Articles/2013/09/01/Going-Beyond-Usernames-and-Roles.aspx?Page=1
【讨论】:
这是另一篇介绍如何设置的文章:bitoftech.net/2014/06/01/…【参考方案2】:因此,要克服的主要障碍是认为所有 WebAPI 请求(使用 OData 语法)都是无状态的。当然,在无状态环境中,这会使这变得更加困难。
但是,通过 web.config
保护的 WebAPI 端点需要经过身份验证的(有状态)请求,我们应该能够通过类似 @ 987654322@.
一旦建立,我们将需要添加类似“WHERE UserID = userId;”的内容在发出请求之前:
var unitOfWork = new Repository.UnitOfWork(_db);
var users = options.ApplyTo(unitOfWork.Repository<MyTable>().Queryable
.Include(w => w.NavigationProperty1)
.Where(u => u.UserId == UserContext.Identity.UserId)
.OrderBy(o => o.SomeProperty))
.Cast<MyTable>().ToList();
欢迎提出其他建议。
【讨论】:
如果当前用户没有正确的角色成员资格而不是尝试混合身份验证逻辑,那么使用请求过滤器来防止控制器上的操作调用不是更有意义吗进入业务逻辑? @Wardy - 您是指包含u.UserId
吗?我得到了请求过滤器部分,但我还想确保实际查询是特定于用户的。以上是关于如何安全地使用 MVC WebAPI OData 端点?的主要内容,如果未能解决你的问题,请参考以下文章
WebAPI OData 5.0 Beta - 访问 GlobalConfiguration 引发安全错误
如何正确地将 OData 与 ASP.net Core 集成
Asp.Net MVC4 Web API - 我们是不是需要 OData 来构建快速查询服务
使用asp.net webapi实现oData inlinecount [重复]
WebAPI OData错误ObjectContent类型无法序列化内容类型'application / json ...'的响应正文