简单会员提供程序 - 实体框架和角色

4

我正在尝试尽可能地按照规范在MVC 4中使用Simple Membership Provider。以下是当前的情况:

-- 我一直在使用Jon Galloway在这个主题上的博客文章(链接)

1)我知道这个东西是通过Entity Framework进行连接的。然而,当我向UserProfile类添加属性时,它们并没有在生成表时自动出现。这是由于数据库已经被生成(表不存在)吗?我手动添加了这些字段,并且它是可用的,但是了解关于导致字段不能自动生成的“陷阱”将会很好。

2)就角色而言,它似乎主要面向全局权限类型的事物(例如,用户是User、Admin等)。如果您想让它处理项目级别的事物(例如,project1的管理员,project2的用户),需要进行哪些修改?

等等)是否有一篇文章详细介绍如何扩展它的最佳实践?


你应该能在这个主题上找到很多帖子,例如http://stackoverflow.com/questions/14672205/code-first-membership-provider/14672293#14672293。 - phil soady
你想要做什么?使用SimpleMembership但扩展Db吗? - phil soady
UserProfile对象具有UserId和UserName。我添加了电子邮件,名称(用于全名)和IsLockedOut。由于某种原因,在生成表时,这些属性不会创建数据库中的字段。我能够通过手动创建这些列来解决它,只是好奇它们不生成的原因(无法查看WebSecurity方法的源代码,这是有道理的)。角色表是id和role,但尝试将其切换到id、project、role。目前认为我需要避免内置的Role add/check函数并构建检查,而是按照惯例进行。 - Robert
1个回答

5

1) 我发现Simple Membership中的UserProfile表有点复杂(但是这是好事),但它对我的应用程序非常有效。

Simple Membership的约定是创建名为“UserProfile”的UserProfile表,其中包含两个字段UserId和UserName。您可以通过修改Filters / InitializeSimpleMembershipAttribute.cs中的WebSecurity.InitializeDatabaseConnection()行来配置不同的表名或不同的UserId和UserName字段名称,以便为UserProfile进行配置。如果Simple Membership第一次运行时找到了一个UserProfile表并且其中包含其他字段,则将使用该表。在默认配置下,第一次运行SimpleMembership时,它将创建数据库表,其中包括在Filters / InitializeSimpleMembershipAttribute.cs中指定的任何UserProfile表详细信息。

因此,关键是在第一次调用Simple Membership之前创建所需的UserProfile表(包括您希望在该表中使用的所有字段)。这可以由EF迁移创建,也可以由数据库脚本创建,甚至可以在SSMS中手动创建。

如果您想深入了解Simple Membership代码,请参见http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/5cb74eb3b2f3#src/WebMatrix.WebData/WebSecurity.cshttp://aspnetwebstack.codeplex.com/SourceControl/changeset/view/5cb74eb3b2f3#src/WebMatrix.WebData/SimpleMembershipProvider.cs

2) 我同意您关于角色和全局权限的观点。也许您可以使用AddUsersToRoles和RemoveUsersFromRoles(在http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/5cb74eb3b2f3#src/WebMatrix.WebData/SimpleRoleProvider.cs中)根据他们使用的项目在登录时修改用户的角色。

等等)我不知道有关扩展Simple Membership的好文章,但原则上Simple Membership扩展了扩展的Membership Provider,该提供程序扩展了ASP.NET Membership Provider。您应该能够在适当的位置进入。

编辑以回应Robert的评论:

直接回答为什么Entity Framework没有创建添加到UserProfile类的列,这是因为在应用程序特定表格创建运行之前,SimpeMembership初始化已经创建了UserProfile表。原因是SimpleMembership具有UserProfile表的内置定义,该定义在任何时候SimpleMembership创建该表时都会使用。 UserProfile表创建的时间很重要,因此需要确保在运行SimpleMembership初始化之前创建应用程序特定的表格。


1
我认为这个答案令人满意地回答了问题。还有一些疑问(为什么Entity Framework没有创建我的列),但总的来说,非常满意回答(主要是因为包含了相关源代码)。 - Robert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接