Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF数据服务oData从QueryInterceptor引发异常_C#_Wcf_Odata - Fatal编程技术网

C# WCF数据服务oData从QueryInterceptor引发异常

C# WCF数据服务oData从QueryInterceptor引发异常,c#,wcf,odata,C#,Wcf,Odata,我遇到的情况是,允许具有特定角色的用户查看oData提要的全部内容,而不具有该角色的用户可以查看“他们的”记录 该模型包含一个UserId字段。注意:这适用于使用内置AD角色提供程序的内部intranet站点。不具有特定角色的用户可以查看其用户Id与用户Id字段值匹配的任何记录。如果没有特定角色的个人试图访问那些值不匹配的记录,我想抛出一个未授权的异常 最终,QueryInterceptor返回的表达式似乎在稍后被转入SQL并用于过滤结果。这意味着throw语句在表达式中没有真正意义 有没有其他

我遇到的情况是,允许具有特定角色的用户查看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禁止状态代码