c#EF winforms:对特定表单的基于角色的访问权限
我需要为我的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
角色的用户对应用程序中的表单具有定义良好的访问级别
我的数据库中有一个基本的用户
实体:
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存储在单例类中,在这里您还可以存储用户设置等。这样您就不必向每个子表单传递用户/访问对象。