如何将ASP.NET成员资格用于用户定义的权限

时间:2011-11-13 19:37:27

标签: asp.net

我有一个简单的ASP.NET MVC 3应用程序。我有我为应用程序设计的数据库,它对应于域模型(在App.Domain程序集中)。 我自动生成了Application Services Membership表并将它们添加到应用程序数据库中。会员资格创建工作正常。 我创建了一个'Permission'表,它有一个复合PK,由UserId(来自自动生成的aspnet_Users表)和ContentId(来自Content表,包含应用程序内容)组成。 我们的想法是允许用户为其创建的内容分配权限给其他用户。 我的计划是在控制器中放置逻辑,如下所示: 折叠|复制代码

Guid currentUser = (Guid)Membership.GetUser().ProviderUserKey;
int[] accessible = (from p in context.Permissions
                         where p.UserId == currentUser
                         select p.ContentId).toArray();

然后获取当前用户的内容,如下所示: 折叠|复制代码

IEnumerable<content> content = context.Content
            .Where(x => x.PublicAccess < 3 
            || accessible.Contains(x.ContentId));</content>

如果我有任何意义,任何人都可以告诉我这是否是处理用户定义权限的正常方法。 此外,此代码不起作用,因为它不会将linq强制转换为int []。对此有何帮助?

1 个答案:

答案 0 :(得分:1)

通常,权限由角色子系统处理。你做这样的事情:

if (User.IsInRole("RoleName")) {
   DoWhateverTheUserIsAllowedToDo();
}

您可以通过查找分配给内容的角色或用户,以及检查用户是否在该角色中,或者是否明确允许用户,将其与动态分配的内容权限相结合。

基于角色的权限比将用户分配到特定页面更好。随着页面数量的增长,将用户分配到页面变成了一场噩梦。因此,您通常会将角色分配给页面,然后将用户分配给角色。

您的代码似乎想要做很多工作,返回许多不同的内容项。通常,您知道要控制访问的项目。所以你可以这样做:

var roles = Roles.GetRolesForUser()
var content = from p in context.Permissions where p.ContentID == contentID 
                      && roles.Any(x => p.Roles.Contains(x)) select p;

但是,有很多方法可以做到这一点,你将决定什么最适合你。

我不明白你最后一点没有转换为int []。我认为.toArray()是拼写错误,应该是.ToArray()。如果ContentIDint,则.ToArray应该创建int[]