c#EF winforms:对特定表单的基于角色的访问权限

c#EF winforms:对特定表单的基于角色的访问权限,c#,winforms,entity-framework,authentication,authorization,C#,Winforms,Entity Framework,Authentication,Authorization,我需要为我的WinForms应用程序提供一些授权/身份验证机制,以便具有特定角色的用户对应用程序中的表单具有定义良好的访问级别 我的数据库中有一个基本的用户实体: public class User { public int UserId {get; set;} public string Login {get; set;} public string Password {get; set;} (encrypted of cource) public UserRo

我需要为我的WinForms应用程序提供一些授权/身份验证机制,以便具有特定
角色的用户对应用程序中的表单具有定义良好的访问级别

我的数据库中有一个基本的
用户
实体:

public class User
{
    public int UserId {get; set;}
    public string Login {get; set;}
    public string Password {get; set;} (encrypted of cource)
    public UserRole Role {get; set;}
}

public enum UserRole 
{   
    Admin,
    Service,
    Operator
}
假设我的应用程序由以下表单组成:

  • MainForm
    -带有导航菜单的主表单,允许调用其他表单
  • FormA
    ->从
    main表单调用
  • FormB
    ->从
    MainForm
  • FormC
    ->从
    MainForm
  • 子表单1
    ->从
    FormA
  • subform1
    subform2
    ->从
    FormB
  • SubFormC1
    ->从
    FormC
当然,它可能会更深入

根据其角色,用户可以执行以下操作:

  • Admin
    • 完全访问:
      MainForm
      和从中调用的所有表单
    • 无法访问
      表单c
      (和
      子表单c1
  • 操作员
    • 完全访问:
      main表单
      FormA
      (和
      子表单1
    • 只读(预览)访问:
      FormB
      FormC
      (和
      子表单1
      子表单2
子表单C1
  • 服务
    • 完全访问
      main表单
      FormC
    • 只读(预览)访问
      表单b
      表单
      (和
      子表单1
      子表单1
  • 应用程序的入口点将是
    LoginForm
    ,它将在应用程序运行时作为第一个表单启动。用户在此处输入其凭据,如果凭据有效,则会将其传递到
    main表单

    现在有问题:

  • 如何以及在何处存储整个应用程序中当前登录用户的信息?
    • 作为
      MainForm
      中的属性(使用加密数据)
  • 如何保护每个表单
  • 我正在考虑创建一个额外的实体来保存表单名称列表,特定的帐户角色可以访问该列表,但这似乎不是一个正确的方法

    public class FormPermission
    {
        public int FormPermissionId {get;set;}
        public string FormName {get;set;}
        public FormPermissionType PermissionType {get; set;}
        public virtual RolePermission {get; set;}
    }
    
    public enum FormPermissionType
    {
        Full,
        ReadOnly,
        NoPermission
    }
    
    public class RolePermission
    {
        public int RolePermissionId {get;set;}
        public virtual ICollection<FormPermission> Permissions {get;set}
    }
    
    公共类FormPermission
    {
    public int FormPermissionId{get;set;}
    公共字符串FormName{get;set;}
    public FormPermissionType PermissionType{get;set;}
    公共虚拟角色权限{get;set;}
    }
    公共枚举FormPermissionType
    {
    满满的,
    只读,
    不允许
    }
    公开课角色许可
    {
    public int RolePermissionId{get;set;}
    公共虚拟ICollection权限{get;set}
    }
    

    关于如何处理此问题的任何建议?

    第一个建议是不要直接将权限与UI关联。这种关系应该是间接的。关于实现它,这是一个非常普遍的问题。您必须启用/禁用、显示/隐藏部分UI。如果您可以处理整个表单,则可以创建一个要从中继承的表单,该表单将处理其上控件的Enabled属性。好的,但是如何(安全地)存储当前登录用户的信息,以及如何确定他对尝试访问的表单拥有何种访问权限?例如,是否应将当前用户角色注入到每个表单中,然后进行评估?注入是一种方法,或者您可以将userinfo存储在单例类中,在这里您还可以存储用户设置等。这样您就不必向每个子表单传递用户/访问对象。