0

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

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

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

4

1 回答 1

1

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

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

你不是第一个有这样的要求 -> WCF Dataservice - 在返回结果之前修改对象?

也许您可以使用(自定义)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

于 2013-09-17T16:02:29.693 回答