除了已经在AccountController.cs文件中生成的内容之外,我无法让WebSecurity对象在任何地方工作。 Account控制器在顶部设置了 [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);
}
...并获取原始错误消息,提示应该在blah blah blah之前调用WebSecurity.InitializeDatabaseConnection。非常感谢您对这种疯狂现象的任何见解。
[InitializeSimpleMembership]
属性,现在它可以工作了。 - jwatts1980