C# WCF数据服务oData从QueryInterceptor引发异常
我遇到的情况是,允许具有特定角色的用户查看oData提要的全部内容,而不具有该角色的用户可以查看“他们的”记录 该模型包含一个UserId字段。注意:这适用于使用内置AD角色提供程序的内部intranet站点。不具有特定角色的用户可以查看其用户Id与用户Id字段值匹配的任何记录。如果没有特定角色的个人试图访问那些值不匹配的记录,我想抛出一个未授权的异常 最终,QueryInterceptor返回的表达式似乎在稍后被转入SQL并用于过滤结果。这意味着throw语句在表达式中没有真正意义 有没有其他方法可以满足我的要求 我的一个查询拦截器示例:C# WCF数据服务oData从QueryInterceptor引发异常,c#,wcf,odata,C#,Wcf,Odata,我遇到的情况是,允许具有特定角色的用户查看oData提要的全部内容,而不具有该角色的用户可以查看“他们的”记录 该模型包含一个UserId字段。注意:这适用于使用内置AD角色提供程序的内部intranet站点。不具有特定角色的用户可以查看其用户Id与用户Id字段值匹配的任何记录。如果没有特定角色的个人试图访问那些值不匹配的记录,我想抛出一个未授权的异常 最终,QueryInterceptor返回的表达式似乎在稍后被转入SQL并用于过滤结果。这意味着throw语句在表达式中没有真正意义 有没有其他
[QueryInterceptor("Notifications")]
public Expression<Func<Notification, bool>> OnQueryNotifications()
{
var user = HttpContext.Current.User;
var userId = user.Identity.UserId(); //Extension method
// returns boolean if the user is in any of the roles passed in the array
var allowed = SiteSecurity.Allowed(user, new string[] { "Administrator", "Technician" });
if (!allowed)
// Here is where I need to test if the user is requesting any specific
// records, and if they are allowed to view those records.
return q => q.UserId.Equals(userId, StringComparison.OrdinalIgnoreCase);
else
return q => true;
}
[QueryInterceptor(“通知”)]
查询通知()的公共表达式
{
var user=HttpContext.Current.user;
var userId=user.Identity.userId();//扩展方法
//如果用户处于数组中传递的任何角色中,则返回布尔值
var allowed=SiteSecurity.allowed(用户,新字符串[]{“管理员”,“技术员”});
如果(!允许)
//在这里,我需要测试用户是否请求任何特定的
//记录,以及是否允许他们查看这些记录。
返回q=>q.UserId.Equals(UserId,StringComparison.OrdinalIgnoreCase);
其他的
返回q=>true;
}
您可以通过只返回他们有权访问的记录来排除记录(如上所述)
或者,如果用户试图获取他们无权访问的数据,则可以返回403禁止状态代码