我有两个与 WCF 数据服务相关的问题:
有没有办法根据用户的权限限制用户可见的实体?例如,角色超级用户的用户应该能够查询完整的“联系人”实体,但权限较低的用户只能看到“联系人”实体的特定属性。
每当用户在服务上运行查询时,我希望将其记录到数据库中以进行审计。这可能吗 ?
我有两个与 WCF 数据服务相关的问题:
有没有办法根据用户的权限限制用户可见的实体?例如,角色超级用户的用户应该能够查询完整的“联系人”实体,但权限较低的用户只能看到“联系人”实体的特定属性。
每当用户在服务上运行查询时,我希望将其记录到数据库中以进行审计。这可能吗 ?
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