Я собираюсь сойти с ума, поэтому я еще раз попытаюсь получить помощь... Я использую Visual Studio Express 2012 для Интернета, чтобы создать интернет-проект с использованием C# + MVC4 + Razor + Entity Framework + ASP.NET 4.5. Мне нужно сделать следующее: автоматически создать пользователя «admin» (который будет авторизован на всем сайте), а затем создать несколько ролей пользователей. Я читал о SimpleMembership, ролях и обо всем этом во всем Интернете, но, похоже, ничто не дает мне простого метода заставить все это работать.
Вот что я сделал до сих пор:
1- Создал класс DataContext:
public class DataContext : DbContext
{
public DataContext()
: base("DefaultConnection")
{
}
public DbSet<UserProfile> UserProfiles { get; set; }
}
2- Создал класс инициализатора, который, как я полагаю, даст мне пользователя-администратора и созданную роль администратора:
public class DataContextDbInitializer : DropCreateDatabaseAlways<DataContext>
{
protected override void Seed(DataContext context)
{
var roles = (Webmatrix.WebData.SimpleRoleProvider)System.Web.Security.Roles.Provider;
var membership = (Webmatrix.WebData.SimpleMembershipProvider)System.Web.Security.Membership.Provider;
if (!roles.RoleExists("Admins")) {
roles.CreateRole("Admins");
}
if (membership.GetUser("admin", false) == null) {
membership.CreateUserAndAccount("admin", "123456");
}
if (!roles.GetRolesForUser("admin").Contains("Admins")) {
roles.AddUsersToRoles(new[] { "admin" }, new[] { "Admins" });
}
}
}
(Я пробовал наследовать от DropCreateDatabaseIfModelChanges, но это не помогает).
3- В метод App_Start в Global.asax добавлены две строки:
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
Database.SetInitializer<DataContext>(new DataContextDbInitializer());
Я также пытался использовать WebSecurity.InitializeDatabaseConnection в методе Seed в моем классе DataContextDbInitializer, но это не сработало.
4- Удалена аннотация [InitializeSimpleMembership] из AccountController, поэтому я могу инициализировать его с самого начала жизненного цикла приложения (используя WebSecurity.InitializeDatabaseConnection в App_Start, как я объяснил в пункте 3) . Я попытался добавить [InitializeSimpleMembership] поверх метода Index в HomeController и удалить WebSecurity.InitializeDatabaseConnection из App_Start, но это тоже не помогает.
5- В Web.config у меня есть метод аутентификации как Forms (по умолчанию), а также я оставил строку подключения по умолчанию:
<connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-TPFinal-20130121210447;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnet-TPFinal-20130121210447.mdf" providerName="System.Data.SqlClient" />
</connectionStrings>
И добавил это внутри тега system.web:
<roleManager enabled="true" cacheRolesInCookie="true" />
6- Затем, чтобы проверить, все ли работает, я использую аннотацию [Authorize(Roles = "Admins")] поверх метода About() в HomeController. Если бы все работало так, как ожидалось, это должно заставить меня войти в систему как admin/123456, чтобы увидеть страницу «О программе», контролируемую HomeController/About.
7- Я не добавлял миграции EF или что-то еще. Все остальное по умолчанию, так как VS2012 создал его автоматически. Итак, я запускаю свое приложение и нажимаю ссылку «О программе», и мне предоставляется форма входа в систему (это означает, что аннотация [Authorize (Roles = «Admins»)] делает то, что ожидается). Я пытаюсь войти в систему как admin/123456, но страница входа перезагружается снова и снова, каждый раз, когда я нажимаю кнопку входа.
Несколько вещей, которые я заметил:
-если я добавлю точку останова в методе Seed, кажется, что он не вызывается.
-когда я использую DropCreateDatabaseAlways и снова запускаю приложение, я могу войти в систему как admin/123456, что заставляет меня снова подумать, что весь мой класс DataContextDbInitializer даже не используется, поскольку я предполагаю, что БД должна быть создана с нуля, который удалит пользователя-администратора.
Я не знаю, что еще почитать, что еще попробовать... Я новичок в asp.net (надо ли это говорить?) и просто схожу с ума. Спасибо!!