使用Linq to SQL检查当前用户的表权限

时间:2017-01-04 16:59:40

标签: c# sql-server linq

我已设置数据库上下文并配置了.dbml。设置完成后,我确保将凭据设置为Windows身份验证。我想做的是,在应用程序的开头,点击单个.dbml中的三个表中的每一个,并返回用户对每个表的特权。使用Linq有什么选择?下面的代码是我考虑攻击它的方式。 1)我可以查询context.Mapping.GetTables()的结果吗? 2)获取权限的查询是什么样的?

class privlidgeCheck
{


    public static IQueryable<IHS_XREF> getXref()
    {


        DAMDataContext context = new DAMDataContext();
        var tables = context.Mapping.GetTables();

        foreach (var table in tables)
        {
            var q = from x in table select x // query schema?
        }


    }

}

1 个答案:

答案 0 :(得分:1)

如果您作为主体登录数据库/服务器,则尝试确定他们是否具有权限,您可以使用函数fn_my_permissions进行查询

SELECT * FROM fn_my_permissions('[schema].[TableName]', 'OBJECT'); 

但是,指定Windows身份验证实际上可能意味着您使用单个公共帐户连接到数据库,该帐户用于运行运行应用程序的服务(ASP.NET?)。

在这种情况下,您需要使用其他方法来执行安全性。例如ASP.NET Membership或ASP.NET Identity Provider模型,或者滚动您自己的安全系统。

我提到了ASP.NET的东西,因为我假设您正在使用ASP.NET Web应用程序。

编辑:由于这是一个WPF应用程序,您可以使用上面的查询语句来确定用户对相关表/ view / sp的权限。

using (var context = new DAMDataContext()) {
         var sql = "SELECT COUNT(*) FROM fn_my_permissions(@objectName, 'OBJECT') where subentity_name = '' and permission_name = 'SELECT';";
         var param = new SqlParameter("objectName", "[schema].[TableName]");

         var results = context.Database.SqlQuery<int>(sql, param);
}

或者将其调整到DbContext实现(DAMDataContext)中,并将对象名称作为参数传递。 (此代码块仅用于演示)

作为最后一点注意事项=确保始终处理实现IDisposable(您的DAMDataContext)的任何内容

使用声明是一种很好的方法。