Я не могу заставить объект WebSecurity работать в любом месте, кроме того, что уже было создано в файле AccountController.cs. Контроллер учетной записи имеет атрибут [InitializeSimpleMembership]
, расположенный сверху. Например, функции входа в систему не жалуются на вызов WebSecurity.Login(...)
. Я добавил дочернее действие в AccountController:
[ChildActionOnly]
[AllowAnonymous]
public ActionResult NavBar()
{
NavBarViewModel viewModel = new NavBarViewModel();
viewModel.LinkItems = new List<NavBarLinkItem>();
if (Request.IsAuthenticated)
{
SimpleRoleProvider roleProvider = new SimpleRoleProvider();
if (roleProvider.IsUserInRole(User.Identity.Name, "User"))
{
viewModel.LinkItems.Add(new NavBarLinkItem()
{ Title = "Create Project", Action = "Create", Controller = "Project" });
}
}
viewModel.LinkItems.Add(new NavBarLinkItem() { Title="Help", Action="Index", Controller="Help" });
return PartialView("_NavBar", viewModel);
}
Влево, как есть, код падает на "if (roleProvider.IsUserInRole(User.Identity.Name," Пользователь "))" строка с сообщением об ошибке объекта. Поэтому я перехожу в файл InitialzeSimpleMembershipAttribute.cs и копирую/вставляю эту строку в верхней части моей функции:
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
... и получите сообщение об ошибке, что WebSecurity.InitializeDatabaseConnection следует вызывать только один раз. Это имеет смысл, потому что в верхней части определения контроллера есть атрибут, который должен был вызвать эту функцию уже (и, похоже, это просто отлично). Чтобы быть в безопасности, я перехожу выше:
if (!WebSecurity.Initialized)
{
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId",
"UserName", autoCreateTables: true);
}
... и вернуть исходное сообщение об ошибке, что WebSecurity.InitializeDatabaseConnection следует вызывать перед бла-бла-бла. Любое понимание этого безумия получило бы высокую оценку