2

我将 WCF 与我的 ASP.NET MVC 应用程序一起使用,我的数据服务从我的 (EF 4.1) .mdf 文件中获取数据。但是我想通过身份验证显示一些字段,例如:

public static void InitializeService(DataServiceConfiguration config)
{
    config.SetEntitySetAccessRule("Exercies", EntitySetRights.All);
    config.SetServiceOperationAccessRule("GetAllExercies", ServiceOperationRights.All);
    config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
}
[WebGet]
public IQueryable<Exercise> GetAllExercies(string name, string pass)
{
    if (Membership.ValidateUser(name, pass))
        return CurrentDataSource.Exercies;
    else
        return CurrentDataSource.Exercies.Where(e => e.Public == true);
}

现在,当用户访问 httx://localhost/MyService.svc/Exercies 时,尽管没有给出用户名并通过,但他们可以获得所有内容。
我的临时解决方案是将 GetAllExercies 重命名Exercies我不确定是否有更好的方法......

4

1 回答 1

2

是的,有一个更好的解决方案:查询拦截器。事实上,对实体集和服务操作使用相同的名称往往会在某些情况下导致问题($metadata 对客户端来说是“令人困惑的”)。它也不是 100% 安全的(如果有的话,不会阻止通过某些导航属性访问实体)。

请参阅此http://msdn.microsoft.com/en-us/library/dd744842.aspx。这个想法是您将身份验证过滤器作为实体集查询的一部分,WCF DS 服务确保它将在访问实体集的任何地方使用。

于 2012-01-09T15:56:37.850 回答