2009-12-22 22 views
1

我有一定的要求设计一个WCF服务为基础的系统来筛选在C#中的角色要求如何设计一个系统来过滤角色上的请求?

Rules 
    User can access X 
    SuperUser can access Y 
    Admin can access Z 

    Database 
    Resource AccessControl 
    X  User,SuperUser,Admin 
    Y  Admin 
    Z  Admin 

如何创建一个系统,我可以把这些accesscontrols变得像一个散列或计算的数学值,使得我没有做多的检查,像

If(user = RequestUser.Role.User||user = RequestUser.Role.Admin) 
{} 

而是做这样的事情

Resource AccessControl    someCalculatedHashValue 
    X  User,SuperUser,Admin  ???? 
    Y  Admin     ???? 
    Z  Admin     ???? 

if(user >= someCalculatedHashValue){} 

注:有可能是一对多的关系图

+0

用户是否只有一个角色? – 2009-12-22 16:29:05

+0

可能有多个角色 – 2009-12-22 16:46:13

回答

0

你不能为你的角色使用位向量(即: Flags枚举)?

这样你可以简单地将这些位加起来作为你的“散列”。

0

您可以通过包装您描述的排名逻辑来创建实现IsInRole的IPrincipal的自定义实现。


现在我仔细看看你的问题,听起来很像基于ACL的安全性,而不是基于角色的安全性。您可能需要改为look at this

0

您未能提供有关系统的详细信息。根据所使用的技术,已经有成熟和熟知的技术来管理这个(例如WCF为你提供这个“免费”)。

的样本可能是不完全或者,因为你的方式呈现它

用户,超级用户,管理员
联系
联系

这可以用一个简单的枚举处理和一个int比较和这样一个枚举:

public enum Role { 
    Anonymous, 
    User, 
    SuperUser, 
    Admin 
} 

if (user >= (int)Role.User) ... 

但是,这可能太简单,不包括你的真正需要?总之:你能详细说明一下吗?

+0

假设这是在WCF中完成的,有什么可用的开箱即用的? – 2009-12-22 16:41:41

+0

WCF允许您根据您的设计以声明方式进行授权(如果没有声明)。如果您希望/需要在Code中执行此操作,它也会支持您,但最终会出现同样的问题,必须将角色映射到操作。 所以 - 那时你会回到你的“如果一团糟”或回到开头。您可以查看枚举,也可以探索是否可以将逻辑提取为扩展方法或类似的东西,这可以实现访问权限和角色/用户之间的映射。 – 2009-12-22 20:35:41