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は1回だけ呼び出す必要があるというエラーメッセージを受け取ります。これは理にかなっています。なぜなら、コントローラー定義の上部に、この関数を既に呼び出す必要のある属性があるからです(そして、それは問題なく行われているようです)。安全のために、上記の呼び出しを次のように変更します。
if (!WebSecurity.Initialized)
{
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId",
"UserName", autoCreateTables: true);
}
...そして、元のエラーメッセージを取得します。WebSecurity.InitializeDatabaseConnectionは、何とか何とか何とか前に呼び出す必要があります。この狂気への洞察は大歓迎です