これは、SimpleMembershipProvider が初期化されていない場合に発生する可能性があります。MVC フォーム認証テンプレートの例では、サイトへの匿名アクセスを許可し、ログイン ページに移動するまでメンバーシップ プロバイダーを初期化しないことを前提としています。ただし、より一般的なセキュリティ手法は、サイトへのアクセスにログインを要求し、ロールによって決定されるように _layout ページでメニューの選択肢を定義することです。ただし、永続的な Cookie を使用すると、ログイン ページに再度アクセスしないため、認証されたユーザーのロールがメンバーシップ データベースから読み込まれません。
やりたいことは、ユーザーがサイトに入ったときにプロバイダーを初期化して、値が読み込まれるようにすることです。これを行うには、App_Start フォルダーの FilterConfig クラスの RegisterGlobalFilters メソッドに次のフィルターを追加します。
filters.Add(new YourAppNameSpace.Filters.InitializeSimpleMembershipAttribute());
これにより、Cookie で認証されたユーザーがサイトにアクセスしたときに、データベースからユーザー データが読み込まれます。
もう 1 つの代替手法は、[InitializeSimpleMembership] デコレーターを、Cookie で認証されたユーザーが直接入力するコントローラー メソッドに追加することです。ただし、多くのコントローラーに配置する必要がある場合、これは面倒です。したがって、ほとんどの場合、グローバル フィルターに入れる方が適切です。