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