WebApi Odata,根据用户角色限制少数列

WebApi Odata,根据用户角色限制少数列,odata,asp.net-web-api2,Odata,Asp.net Web Api2,我有多个角色可以访问我的odata服务,根据角色,我需要隐藏几个列。我怎样才能做到这一点 自定义DefaultODataSerializerProvider public override ODataSerializer GetODataPayloadSerializer(IEdmModel model, Type type, HttpRequestMessage request) 重写GetODataPayloadSerializer方法,通过请求获取角色,将其存储在客户序列化程序中,返回客

我有多个角色可以访问我的odata服务,根据角色,我需要隐藏几个列。我怎样才能做到这一点

  • 自定义DefaultODataSerializerProvider

    public override ODataSerializer GetODataPayloadSerializer(IEdmModel model, Type type, HttpRequestMessage request)
    
    重写GetODataPayloadSerializer方法,通过请求获取角色,将其存储在客户序列化程序中,返回客户序列化程序

  • 如果返回实体,请自定义ODataEntityTypeSerializer

    public override ODataEntry CreateEntry(SelectExpandNode selectExpandNode, EntityInstanceContext entityInstanceContext)
    
  • 重写CreateEntry方法,通过角色删除属性。比如:

                var idProp = selectExpandNode.SelectedStructuralProperties.FirstOrDefault(p => p.Name == "Id");
                if (idProp != null)
                {
                    selectExpandNode.SelectedStructuralProperties.Remove(idProp);
                }
                ODataEntry entry = base.CreateEntry(selectExpandNode, entityInstanceContext);
                return entry;
    
  • 自定义DefaultODataSerializerProvider

    public override ODataSerializer GetODataPayloadSerializer(IEdmModel model, Type type, HttpRequestMessage request)
    
    重写GetODataPayloadSerializer方法,通过请求获取角色,将其存储在客户序列化程序中,返回客户序列化程序

  • 如果返回实体,请自定义ODataEntityTypeSerializer

    public override ODataEntry CreateEntry(SelectExpandNode selectExpandNode, EntityInstanceContext entityInstanceContext)
    
  • 重写CreateEntry方法,通过角色删除属性。比如:

                var idProp = selectExpandNode.SelectedStructuralProperties.FirstOrDefault(p => p.Name == "Id");
                if (idProp != null)
                {
                    selectExpandNode.SelectedStructuralProperties.Remove(idProp);
                }
                ODataEntry entry = base.CreateEntry(selectExpandNode, entityInstanceContext);
                return entry;
    

    你的代码在哪里!到目前为止,你尝试了什么?那么,我尝试了以下几件事:1。探索了Queryinterceptors,但它们是wcf的特性,而不是webapi。如果我错了,请纠正我。我找不到与webapi相关的示例。2.我尝试在控制器中切换角色,并编写linq select语句来投影基本对象。类似于:.Mydata.Select(p=>newmyobject{myobject.Property1=p.Property1,…);基于角色。但这会给我一个错误,因为我正在尝试投影现有对象。您是否尝试添加
    .ToList().Select(…)
    to it?您通常需要从sql到实体再到对象再到实体,才能使投影工作。ToList()的问题它具体化了查询,并对性能产生了影响。我正在查询的数据类型有数百万条记录,尽管我已经定义了页面大小。也许您可以使用验证器?来执行此操作。您可以“验证$select、$expand&$filter”基于你的安全规则。不确定它的复杂程度:这里是你的代码!到目前为止你尝试了什么?所以,我尝试了以下几点:1.探索了Queryinterceptors,但它们是wcf的一个功能,而不是webapi。如果我错了,请纠正我。我找不到与webapi相关的示例。2.我尝试在我的控件中组合角色r并编写linq select语句来投影基本对象。类似于:.Mydata.select(p=>new myobject{myobject.Property1=p.Property1,…);基于角色。但这会给我一个错误,因为我正在尝试投影现有对象。是否尝试添加
    .ToList().select(…)
    to it?您通常需要从sql到实体再到对象再到实体,才能使投影工作。ToList()的问题它具体化了查询,并对性能产生了影响。我正在查询的数据类型有数百万条记录,尽管我已经定义了页面大小。也许您可以使用验证器进行验证?。您可以根据安全规则“验证$select、$expand&$filter”。不确定其复杂性级别:S