如何使用自定义安全性扩展DBContext(EF6.0)

时间:2014-07-28 19:49:31

标签: c# linq entity-framework dbcontext

我实际上是尝试使用自定义用户安全性扩展EF。

实际上,我的逻辑检查其自身的单独功能中的权限,该功能没有EF的真实上下文。但是如果我可以将我的逻辑直接附加到DBContext那将是很好的,这样就可以检查每个linq-Query。

我找到了" IDbCommandInterceptor"接口,但这对我来说太迟了,因为我正在检查类型。

权限检查代码:

/// <summary>
    /// Checks if the current user have the given rights for the given permission 
    /// </summary>
    /// <param name="permittedType"></param>
    /// <param name="requiredPerm"></param>
    /// <returns></returns>
    private CheckResult CheckPermissionFor(Type permittedType, Permissions requiredPerm)
    {
        CheckResult Result = new CheckResult();
        String TypeName = permittedType.Name;
        EntityObjectInfo ObjInfo = (from info in BaseData.EntityInfos where info.Name == TypeName select info).FirstOrDefault();

        if (ObjInfo != null)
        {
            if (ObjInfo.IsSecurityEnabled)
            {
                //Getting all permissions from assinged userpermissions with the right objectname
                IEnumerable<EntityPermission> ObjPerms = Session.AssingedEntityPermissions.Where(f => f.PermittedObject.Name == TypeName);

                if (ObjPerms.Any())
                {
                    //Check if any permission have readonly rights or higher to load the obj
                    if (ObjPerms.Max(f => f.Permission) < requiredPerm)
                        Result.Messages.AddMessage("No permission to " + requiredPerm + " for " + TypeName, MessageType.Error);
                }
                else
                    Result.Messages.AddMessage("No permission for " + TypeName, MessageType.Error);
            }
        }
        else
            Result.Messages.AddMessage("Missing objectinfo for " + TypeName, MessageType.Error);        

        return Result;
    }

感谢

1 个答案:

答案 0 :(得分:0)

嗯,一种方法可以是

  1. 从DbContext

  2. 派生您自己的上下文
  3. 在您的上下文的构造函数中使用某种LoggedOnUser。该实体可以存储权限。

  4. 实施权限检查这样的entite getter

    public DbSet<ClientAddress> ClientAddresses
    { 
        get; //TODO add getting logic with checking permissions
        set;
    }
    
  5. 在部分类(上下文访问)上使用属性,您可以描述所需的权限

  6. 在模型中使用T4生成项。在那里你可以修改输出.cs文件,所以在数据库中使用新实体你不需要重写所有内容,目标3可以自动生成。