2014-02-24 48 views
1

我想加入我的工作,使用VS2013现有的ASP.NET(C#,MVC4)项目角色的认证。启用asp.net角色编程

我有一个类似的问题在一年前以不同的项目,我设法解决,但现在我已经做了同样的事情,并没有任何反应:Seeding data and creating/managing roles in MVC4 - how hard can it be?

这就是我这样做远:

1.我有我自己的DataContext类,取代自带的支架默认的UserContext类:

public class DataContext : DbContext 
{ 
    public DataContext() : base("DefaultConnection") 
    { 
    } 

public DbSet<UserProfile> UserProfiles { get; set; } 
} 

2.我在初始lizer I类加入此:

public class DataContextDbInitializer : DropCreateDatabaseIfModelChanges<DataContext> 
{ 
protected override void Seed(DataContext context) 
{ 
    if (!Roles.RoleExists("Admins")) 
    { 
       Roles.CreateRole("Admins"); 
    } 
    if (!WebSecurity.UserExists("admin")) 
    { 
       WebSecurity.CreateUserAndAccount("admin", "123456"); 
    } 
    if (!Roles.GetRolesForUser("admin").Contains("Admins")) 
    { 
       Roles.AddUsersToRoles(new[] { "admin" }, new[] { "Admins" }); 
    } 
    base.Seed(context); 
} 

3.添加这些行向的Application_Start()方法在Global.asax中:

WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true); 
Database.SetInitializer(new DataContextDbInitializer()); 
DataContext c = new DataContext(); 
c.Database.Initialize(true); 

4.从删除了[InitializeSimpleMembership]注释的AccountController,这样我就可以从应用程序生命周期的开始初始化(在App_Start使用WebSecurity.InitializeDatabaseConnection,正如我在3号已经解释)

5.在web.config中我离开的认证方式为表单(默认)和我的连接字符串看起来像这样:

<connectionStrings> 
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-consultorio;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnet-consultorio.mdf" providerName="System.Data.SqlClient" /> 
    </connectionStrings> 

我说这对System.Web标签内部:

<roleManager enabled="true" cacheRolesInCookie="true" /> 

为了测试一切正常,我添加了[授权(角色=“管理员”)]上,该目录从DB的东西,在一个控制器的方法的顶部注释。

  • 如果我运行这样的应用程序,然后点击用[Authorize]批注触发方法的链接,我会得到一个登录屏幕。我输入用户“admin”的有效凭证,并且页面被重新加载而不会引发任何错误(没有像“错误的用户名”),例外或任何事情。
  • 如果我添加WebSecurity.InitializeDatabaseConnection( “DefaultConnection”, “用户配置”, “用户ID”, “用户名”,autoCreateTables:真);我的种子(DataContext的上下文)方法在我的初始化类中的第一行(前右“如果”创建角色开始),我试图访问受限制的methog时获得相同的行为(显示登录屏幕并重新加载每次输入有效凭证)。
  • 如果我删除WebSecurity.InitializeDatabaseConnection( “DefaultConnection”, “用户配置”, “用户ID”, “用户名”,autoCreateTables:真);在Global.asax中的Application_Start方法行,然后尝试登录时,我得到一个System.InvalidOperationException: 它执行这个时候停止:如果(ModelState.IsValid & & WebSecurity.Login(model.UserName,模型。密码,persistCookie:模型。RememberMe))里面的公共ActionResult登录(LoginModel模型,字符串returnUrl)方法在AccountController中。 错误消息显示“在调用”WebSecurity“类的任何其他方法之前,您必须调用”WebSecurity.InitializeDatabaseConnection“方法。此调用应放置在您网站根目录下的_AppStart.cshtml文件中。所以我认为它不喜欢它,当我从Global.asax中删除该行。 但是我再次添加该行,然后在尝试登录时重新加载页面。

问题是什么?

回答

0

那么,我终于找到了问题,所以我在这里发布后代(也许在一年我会有同样的问题,并会找到我自己的线程!) 代码是好的。我只是有错误的数据库管理方法:由于我的数据库已经创建(这是一个现有的项目,我正在添加角色),Seed方法从未被调用过,因此将角色放在一边。我只需切换到DropDatabaseAlways和voilá!

+0

您应该标记为答案,以便将问题从未答复的问题中删除。很高兴你找到了解决方案。 – JPK

+0

哦,对不起。我标记了它。谢谢! – patr1c1a