Security ADO.NET数据服务中的自定义授权

Security ADO.NET数据服务中的自定义授权,security,ado.net,authorization,wcf-data-services,Security,Ado.net,Authorization,Wcf Data Services,我有一个ADO.NET数据服务,它公开一个实体框架数据模型(.edmx) 我需要允许/拒绝某些用户对某些实体的读/写操作。我使用Windows身份验证。我所能找到的就是覆盖OnStartProcessingRequest: protected override void OnStartProcessingRequest(ProcessRequestArgs args) { base.OnStartProcessingRequest(args); bool isBatch = a

我有一个ADO.NET数据服务,它公开一个实体框架数据模型(.edmx)

我需要允许/拒绝某些用户对某些实体的读/写操作。我使用Windows身份验证。我所能找到的就是覆盖OnStartProcessingRequest:

protected override void OnStartProcessingRequest(ProcessRequestArgs args)
{
    base.OnStartProcessingRequest(args);

    bool isBatch = args.IsBatchOperation;
    System.Uri requestUri = args.RequestUri;

    // parse uri and determine the entity and the operation
    // (i.e.: select/update/delete/insert) will be determined by the HTTP verb
}

然而,我认为这很糟糕,我希望有一个更好的解决方案。。。有什么想法吗(

您可以为每个用户设置服务初始化的实体权限,如

config.SetEntitySetAccessRule("Orders", UserRights.GetRights(identity, "Orders"));

config.SetEntitySetAccessRule("Products", UserRights.GetRights(identity, "Products"));
以这种方式应用资源可见性的主要缺点是可见性在实体级别,而不是行级别

您可以通过服务操作和变更拦截器的组合来克服这一问题

[ChangeInterceptor("Products")]
public void OnProductsChange(Products product, UpdateOperations operations)
{
      if(!UserRights.HasAccessRights(identity, "Products", operations))
      {
             throw new DateServicesException(404, "Access denied!");
      }
}

您可以为每个用户设置服务初始化的实体权限,如

config.SetEntitySetAccessRule("Orders", UserRights.GetRights(identity, "Orders"));

config.SetEntitySetAccessRule("Products", UserRights.GetRights(identity, "Products"));
以这种方式应用资源可见性的主要缺点是可见性在实体级别,而不是行级别

您可以通过服务操作和变更拦截器的组合来克服这一问题

[ChangeInterceptor("Products")]
public void OnProductsChange(Products product, UpdateOperations operations)
{
      if(!UserRights.HasAccessRights(identity, "Products", operations))
      {
             throw new DateServicesException(404, "Access denied!");
      }
}

如果您不希望ppl具有对整个表/资源的特定访问权限,则应使用第一个示例。第二个示例可用于以下情况:用户无法创建超出特定价格差的产品,这取决于某些服务器端计算。如果您不希望ppl具有特定访问权限,则应使用第一个示例对于整个表/资源,第二个示例可用于诸如用户无法创建超出特定价格差(取决于某些服务器端计算)的产品这样的场景。