WCF数据服务为表列而不是整个表设置访问规则

本文关键字:设置 规则 访问 服务 数据 WCF | 更新日期: 2023-09-27 17:49:35

在我的wcf数据服务中,我通过以下方式防止客户端修改客户:

// This method is called only once to initialize service-wide policies.
public static void InitializeService(DataServiceConfiguration config)
{
    // TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.
    config.SetEntitySetAccessRule("Customers", EntitySetRights.None); // <------- HERE
    config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
}

是否有一种方法可以在表customers的特定列上设置规则?例如,我只想在列CustomerPassword上启用读取。

一个解决方案将是移动客户的所有部分,我不希望客户端修改到一个单独的表。这种方法将需要我改变很多我的数据库如果我可以在表列而不是整个表上设置权限,那将是惊人的。

另外,即使我移动了所有我不想让客户端修改的客户列,如CustomerPassword, dateconnconnected等,我如何防止客户端修改该客户的ID ?总有一列是我无法保护的

WCF数据服务为表列而不是整个表设置访问规则

这可以通过一个ChangeInterceptor来实现。例如,如果您想允许客户端修改客户端,但不允许客户端修改md5密码,则执行:

[ChangeInterceptor("Customers")] // table to query intercept
public void WindowsServiceChange(Customer customerEntity, UpdateOperations operations)
{            
        // make sure following colums are not changed
        if (this.CurrentDataSource.Entry(customerEntity).Property("Password").IsModified)
        {
            // client attempted to update a column he was not supposed to update
            throw new DataServiceException(400, "Access to update column denied");
        }
        // else do nothing
}

将此方法放置在数据服务中,每次客户端试图修改或更新客户时,都将通过该方法。该方法还可以帮助您验证客户的属性。甚至在将其插入数据库之前更新其属性