WCF数据服务 - 限制可见性和日志记录查询

时间:2013-09-17 07:53:47

标签: wcf security wcf-data-services odata

我有两个与WCF数据服务相关的问题:

  1. 有没有办法根据用户的权限限制用户可见的实体?例如,角色超级用户中的用户应该能够查询完整的“联系人”实体,但具有较少权限的用户只能查看“联系人”实体的特定属性。

  2. 每当用户在服务上运行查询时,我希望将其记录在数据库中以进行审计。这可能吗 ?

1 个答案:

答案 0 :(得分:1)

1)有拦截器的概念:http://msdn.microsoft.com/en-us/library/dd744842.aspx

但我认为他们在你的情况下不会让你满意: 使用更改拦截器,您可以处理尝试更改特定实体的请求。这可以帮助您避免没有特定权限的用户添加/更改/删除联系人实体。使用QueryInterceptors,您可以处理GET请求。但他们不允许您限制联系人实体的某些属性。

您不是第一个有此类要求的人 - > WCF Dataservice - modify object before returning results?

也许你可以使用(自定义)ServiceOperation和View的组合来处理这个问题。

2)是的,您可以通过处理ProcessingRequest-Event:

来执行此操作
public class YourService : DataService<Entities>
{
    /// <summary>
    /// The logger.
    /// </summary>
    private readonly LogWriter logger;

    /// <summary>
    /// Initializes a new instance of the <see cref="YourService"/> class.
    /// </summary>
    public YourService()
    {
        this.logger = EnterpriseLibraryContainer.Current.GetInstance<LogWriter>();
        this.ProcessingPipeline.ProcessingRequest += this.ProcessingPipelineProcessingRequest;
    }

    /// <summary>
    /// OnProcessingRequest
    /// </summary>
    /// <param name="sender">source</param>
    /// <param name="e">event args</param>
    public void ProcessingPipelineProcessingRequest(object sender, DataServiceProcessingPipelineEventArgs e)
    {
        this.logger.Write(new LogEntry { Message = "SOP ProcessingPipelineProcessingRequest: Unauthorized Access", Severity = TraceEventType.Warning })
    }
}

您可以在此处找到所有这些ProcessingPipeline-Events:http://msdn.microsoft.com/en-us/library/system.data.services.dataserviceprocessingpipeline(v=vs.103).aspx