我有一个简单的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 []。对此有何帮助?
答案 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()
。如果ContentID
是int
,则.ToArray
应该创建int[]
。