使用Enum Flag Bit的基于WPF权限的授权

我已经做了一个月的C#所以请原谅这个问题的’本地性’,但我已经研究了几个小时,我已经打了一堵砖墙。

我已经看到了使用IIdentityIPrincipal 进行基于角色的 WPF应用程序授权的左右示例。

我找不到很多信息,但是,在更多基于权限的授权方法中,在这个应用程序中,想象没有组,只有权限和用户列表,您可以为任何人分配任何权限。

我希望能够:

1)能够根据用户权限控制UI /元素,其状态包括:Enabled,ReadOnly,Invisible,Collapsed(如此处所示https://uiauth.codeplex.com/ )
2)能够在类或方法级别指定需要哪些权限(类似于http://lostechies.com/derickbailey/2011/05/24/dont-do-role-based-authorization-checks-do-activity基础检查/ )

代替:

[PrincipalPermission(SecurityAction.Demand, Role = "Administrators")]

我想要的东西:

[PrincipalPermission(SecurityAction.Demand, Permission = "Can add users")]

现在,我看到如何做到这一点的唯一方法是利用ICommand并使用大量的字符串比较在CanExecute方法中放置授权逻辑,以查看用户是否具有执行请求的操作所需的权限,如:

 // Employee class public bool HasRight(SecurityRight right) { return employee.Permissions.Contains(right); } // Implementation, check if employee has right to continue if (employee.HasRight(db.SecurityRights.Single(sr => sr.Description == "Can edit users"))) { // Allowed to perform action } else { // User does not have right to continue throw SecurityException; } 

我被告知Enum Flags可能正是我正在寻找的[Flags] Enum属性在C#中意味着什么?

我想我理解enum / flag / bits但不足以完成实现……

如果我有:

EmployeeModel
EmployeeViewModel
ThingTwoModel
ThingTwoViewModel
的MainView

我不知道一切都在哪里以及如何将它们联系在一起….这就是我到目前为止所做的事情(我意识到这不是一个有效的例子……这就是我的问题!):

  [Flags] public enum Permissions { None = 0, Create = 1 << 0, Read = 1 << 1, Update = 1 << 2, Delete = 1 << 3, User = 1 << 4, Group = 1 << 5 } public static void testFlag() { Permissions p; var x = p.HasFlag(Permissions.Update) && p.HasFlag(Permissions.User); var desiredPermissions = Permissions.User | Permissions.Read | Permissions.Create; if (x & p == desiredPermissions) { //the user can be created and read by this operator } } 

谢谢你的任何指导。

那么testFlag将无法正常工作。 我想你想要的东西( LINQPad c#program snippet):

 void Main() { //can create user but not read the information back var userCanBeCreatedPermission = Permissions.Create | Permissions.User; //can create and readback var userCanBeCreatedAndReadBackPermission = userCanBeCreatedPermission | Permissions.Read; userCanBeCreatedPermission.HasFlag(Permissions.User).Dump(); //returns true (userCanBeCreatedPermission.HasFlag(Permissions.User) && userCanBeCreatedPermission.HasFlag(Permissions.Read)).Dump(); //returns false //alternative way of checking flags is to combine the flags and do an And mask check //the above can be written as ((userCanBeCreatedPermission & (Permissions.User | Permissions.Read)) == (Permissions.User | Permissions.Read)).Dump(); //returns false //using a variable to have combined permissions for readibility & using And mask: var desiredPermissions = Permissions.User | Permissions.Read; //checking with user that has both Create & Read permissions ((userCanBeCreatedAndReadBackPermission & desiredPermissions) == desiredPermissions).Dump(); // returns true because the user information can be read back by this user ((userCanBeCreatedAndReadBackPermission & Permissions.Delete) == Permissions.Delete).Dump(); // returns false because the user can't be deleted } [Flags] public enum Permissions { None = 0, Create = 1 << 0, Read = 1 << 1, Update = 1 << 2, Delete = 1 << 3, User = 1 << 4, Group = 1 << 5 } 

这是否回答你的问题?

最终解决方案(.linq):

 void Main() { // Permissions definition var userCreate = new Authorization(Permissions.Create); var userRead = new Authorization(Permissions.Read); var carrotCreate = new Authorization(Permissions.Create); var carrotRead = new Authorization(Permissions.Read); // User var user = new User(); // User has no permissions yet if(user.IsAuthorized(Permissions.Create)) "I can create User".Dump(); else "No creating User for me".Dump(); // Now user can Create users user.Authorizations.Add(userCreate); if(user.IsAuthorized(Permissions.Create)) "I can create User".Dump(); else "No creating User for me".Dump(); // User can read carrots user.Authorizations.Add(carrotRead); if(user.IsAuthorized(Permissions.Create)) "I can create carrots".Dump(); else "No creating carrots for me".Dump(); if(user.IsAuthorized(Permissions.Read)) "I can read carrots".Dump(); else "No reading carrots for me".Dump(); // User can now create carrots user.Authorizations.Add(carrotCreate); if(user.IsAuthorized(Permissions.Create)) "I can create carrots".Dump(); else "No creating carrots for me".Dump(); } [Flags] public enum Permissions : ulong { Create = 1 << 0, Read = 1 << 1, Update = 1 << 2, Delete = 1 << 3 } public abstract class Auth{ } public class Authorization : Auth { public Authorization(Permissions permissions){ this.Permissions = permissions; } public Permissions Permissions {get;set;} } public class Carrot{ public int Id{get; set;} } public class User{ public User(){ Authorizations = new List(); } public List Authorizations{get; set;} public bool IsAuthorized(Permissions permission){ foreach(var auth in Authorizations) if(auth is Authorization){ var a = auth as Authorization; if(a.Permissions == permission) return true; } return false; } }