我想加入我的工作,使用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中删除该行。 但是我再次添加该行,然后在尝试登录时重新加载页面。
问题是什么?
您应该标记为答案,以便将问题从未答复的问题中删除。很高兴你找到了解决方案。 – JPK
哦,对不起。我标记了它。谢谢! – patr1c1a