Asp.net mvc 4 如何安全地使用MVC WebAPI OData端点?

Asp.net mvc 4 如何安全地使用MVC WebAPI OData端点?,asp.net-mvc-4,asp.net-web-api,odata,roleprovider,user-roles,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...."/> <

我在
~/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攻击等,但没有读到如何确保不包括公共参数(即
用户id=[此登录用户id]
),将其包含在所有EF请求中。

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

但是,由于WebAPI端点通过
web.config
进行安全保护,需要经过身份验证(有状态)的请求,我们应该能够通过
var UserID=((CustomIdentity)HttpContext.Current.User.Identity)之类的方式获取用户名(或UserID或使用自定义成员资格提供程序时的任何其他自定义属性).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();
var unitOfWork=new Repository.unitOfWork(_db);
var users=options.ApplyTo(unitOfWork.Repository().Queryable
.包括(w=>w.NavigationProperty1)
.Where(u=>u.UserId==UserContext.Identity.UserId)
.OrderBy(o=>o.SomeProperty))
.Cast().ToList();

欢迎更多建议。

在您的API层,您希望实施授权方案,允许您生成索赔。对于Web API,如果使用Web API 2.0,则可以使用新的OAuth 2.0 OWIN中间件。虽然没有很好的文档记录,但它的使用相当简单

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


在您的服务层中,您通常希望采用一种方法,即您有一个授权管理器或类似的工具,将授权逻辑的评估和实施转移到一个中心位置,在以声明方式定义授权规则的同时,请查看本文以了解更多信息:

这是另一篇介绍如何设置授权规则的文章:如果当前用户没有正确的角色成员身份,而不是身份验证,那么使用请求筛选器阻止控制器上的操作调用是否更有意义试图将身份验证逻辑与业务逻辑混为一谈?@Wardy-您指的是包含
u.UserId
?我得到了请求过滤器部分,但我还想确保实际查询是特定于用户的。