我在我的ASP.NET MVC应用程序中使用WCF,我的数据服务从我的(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 重命名为运动,但我不确定是否有更好的方法......
答案 0 :(得分:2)
是的,有一个更好的解决方案:查询拦截器。实际上,对于实体集和服务操作使用相同的名称往往会导致某些情况下的问题($元数据对于客户端来说是“令人困惑的”)。它也不是100%安全(如果有的话,不会阻止通过某些导航属性访问实体)。
见http://msdn.microsoft.com/en-us/library/dd744842.aspx。我们的想法是让auth过滤器成为实体集查询的一部分,WCF DS Service确保它将在访问实体集的任何地方使用。