除了 AccountController.cs 文件中已经生成的内容外,我无法让 WebSecurity 对象在任何地方工作。帐户控制器[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, "User"))" 行与主题错误消息一起崩溃。所以我进入 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 应该在等等等等之前调用。任何对这种疯狂的洞察力将不胜感激