如何安全地使用MVC WebAPI OData端点?

时间:2013-11-29 21:12:39

标签: asp.net-mvc-4 asp.net-web-api odata roleprovider user-roles

我有一个在~/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攻击等,而不是如何确保如果一个公共参数,( ie。UserID=[this logged in user id])不包含在内,以便将其包含在所有EF请求中。

2 个答案:

答案 0 :(得分:2)

在您的API层,您希望实施允许您生成声明的授权方案。对于Web API,如果您使用Web API 2.0,则可以使用新的OAuth 2.0 OWIN中间件。虽然没有太多记录,但使用起来相当简单。

然后,您希望实现一个服务层,该层根据有关访问它的身份的声明(例如角色或其他类型的声明信息)处理授权规则。您可以将API主体或类似对象从API层传递到服务层,如果一旦获得授权,您需要在代码的较低级别进行进一步审核,您始终可以将声明主体作为&#34;用户上下文传递# 34 ;.

在您的服务层中,您通常希望采用一种方法,即您拥有授权管理器或类似工具,将授权逻辑的评估和执行移至中心位置,同时以声明方式定义授权规则 - 看一看在本文中获取更多信息:http://visualstudiomagazine.com/Articles/2013/09/01/Going-Beyond-Usernames-and-Roles.aspx?Page=1

答案 1 :(得分:1)

因此,过去的主要障碍是认为所有WebAPI请求(使用OData语法)都是无状态的。当然,在无国籍的环境中,这使得这更加困难。

但是,通过web.config保护WebAPI端点需要经过身份验证的(有状态的)请求,我们应该能够通过某种方式获取UserName(或UserID或任何其他自定义属性,当使用自定义成员资格提供程序时)比如var userId = ((CustomIdentity)HttpContext.Current.User.Identity).UserId

一旦建立,我们将需要添加类似“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();

欢迎提供其他建议。