Flo*_*lla 4 membership roles asp.net-mvc-4 visual-studio-2012
我一直在阅读大量的文章和论坛,但我仍然无法弄明白...我正在使用Visual Studio Express 2012 for Web构建一个互联网应用程序,使用MVC4 + Razor + Entity Framework CodeFirst.
据我所知,使用SimpleMembership管理MVC4中的用户和角色比以前的版本更简单,应该相当简单.
在我的应用程序中,我只需要授权某些用户组(例如,只有管理员才能访问某些页面).我理解这是通过将参数传递给[Authorize]注释:[Authorize(Roles ="Admins")]但是如何创建这些角色以及如何向其添加用户?
为了要求身份验证,我在控制器方法的基础上添加了注释[Authorize](没有参数),并且无需进行任何额外配置或添加任何其他内容即可工作.此外,当我查看自动创建的数据库时,我看到一个名为webpages_UsersInRoles的表,其中包含UserId和RoleId列.所有这一切使我认为这必须是一个非常简单的任务,因为所有似乎已经准备好并且可以使用,但我无法弄清楚如何;)
到目前为止我尝试过(它没有用)是这样的:我有一个继承自DropCreateDatabaseIfModelChanges的"DataContextDbInitializer"类.Seed方法在该类中被覆盖,我添加了这个(我必须导入System.Web.Security):
Membership.CreateUser("user1", "123456");
Roles.CreateRole("Admins");
Roles.AddUserToRole("user1", "Admins");
Run Code Online (Sandbox Code Playgroud)
我还在Web.config文件的标记中插入了此标记:
<roleManager
enabled="true"
cacheRolesInCookie="true" >
</roleManager>
Run Code Online (Sandbox Code Playgroud)
为了尝试一下,我在控制器中的操作方法之上添加了[Authorize(Roles ="Admins")],然后以"admin"身份登录并尝试访问该方法,但没有运气:(
我不知道还有什么我想念的...如果有人能引导我完成这件事我真的很开心,因为它让我疯狂:P
谢谢!
我的猜测是你的Seed方法没有被调用.通过在方法中放置一个断点并在调试器中运行它来验证是否正在调用它.除非您对应用程序进行了其他更改,否则不会使用EF迁移.默认情况下,使用InitializeSimpleMembershipAttribute初始化数据库.您将看到此属性已添加到帐户控制器,如以下代码所示.
[Authorize]
[InitializeSimpleMembership]
public class AccountController : Controller
{
....
}
Run Code Online (Sandbox Code Playgroud)
这样,只有在访问AccountController时才会调用它.您将在Filters\InitializeSimpleMembershipAttribute.cs中找到该定义.这是来自这个类的代码片段,可能是为什么它不被调用的线索.
// Create the SimpleMembership database without Entity Framework migration schema
((IObjectContextAdapter)context).ObjectContext.CreateDatabase();
Run Code Online (Sandbox Code Playgroud)
InitializeSimpleMembershipAttribute中的许多代码都用于处理不将表单身份验证用于MVC应用程序的场景.如果您将始终使用表单身份验证,则可以删除此代码并自行初始化数据库.只需从AccountController中删除此属性,并将您自己的初始化代码放在Global.asax Application_Start方法中.您可以在Application_Start方法中添加类似的内容
Database.SetInitializer<UsersContext>(new MyDBInitializer());
Run Code Online (Sandbox Code Playgroud)
Seed方法看起来像这样
WebSecurity.InitializeDatabaseConnection("DefaultConnection",
"UserProfile", "UserId", "UserName", autoCreateTables: true);
var roles = (SimpleRoleProvider)Roles.Provider;
var membership = (SimpleMembershipProvider)Membership.Provider;
if (!roles.RoleExists("Admin"))
{
roles.CreateRole("Admin");
}
if (membership.GetUser("user1", false) == null)
{
membership.CreateUserAndAccount("user1", "123456");
}
if (!roles.GetRolesForUser("user1").Contains("Admin"))
{
roles.AddUsersToRoles(new[] { "user1" }, new[] { "Admin" });
}
Run Code Online (Sandbox Code Playgroud)
请注意,您需要通过调用WebSecurity.InitializeDatabaseConnection方法在Seed方法中初始化Web矩阵安全性数据库.
您可以在此博客文章中找到有关播种SimpleMembership的更多详细信息,其中包括示例项目的完整源代码.
| 归档时间: |
|
| 查看次数: |
4227 次 |
| 最近记录: |