新しい MVC4 Web サイトで MvcSiteMapProvider を実装しようとしていますが、修正できないような問題に遭遇しました。
Active Directory で認証をセットアップしました (現在、ロール プロバイダーはありません)。すべてが正常に機能していました。ログイン ページ以外のページにアクセスしようとすると、ログイン ページにリダイレクトされます。アカウント コントローラーのアクション メソッドには [allowAnonymous] 属性があり、認証されていないユーザーがアクセスしてログインできるようにします。
なんらかの理由で、MvcSiteMapProvider をプロジェクトに追加すると、これが機能しなくなり、認証されていないユーザーが任意のページにアクセスできるようになります。MvcSiteMapProvider が作成するメニューは正しく機能し、認証されたユーザーのみが表示できますが、認証されていないユーザーが直接リンクを入力すると、以前のようにログイン ページにリダイレクトされません。
プロジェクトから MvcSiteMapProvider を削除したところ、認証が再び正しく機能し始めました。これは、MvcSiteMapProvider が authorizeAttribute フィルターを何らかの方法でオーバーライドすることと関係があると思いますが、どこでどのように行うのかわかりません。
[Authorize] をコントローラーの上に置くことができ、リダイレクトは MvcSiteMapProvider で機能しますが、それは MVC4 を使用する理由全体に反します。
//this is supposed to set authorize for the entire app
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new System.Web.Mvc.AuthorizeAttribute());
}
この問題は MvcSiteMapProvider/External/AuthorizeAttributeBuilder.cs から発生していると感じていますが、これを理解するのに十分な経験がありません。
更新: グローバル フィルターを正しく設定していないことがわかりました。何らかの理由で、RegisterGlobalFilters メソッドが global.asax ファイルにあったため、FilterConfig.cs ファイルに次の行がありませんでした。
filters.Add(new System.Web.Mvc.AuthorizeAttribute());
global.asax ファイルからメソッドを削除し、上記のフィルターで FilterConfig.cs ファイルを更新したところ、すべてが期待どおりに機能するようになりました。どうやってこの状況になったのかわかりませんが、理解できてよかったです。
mvcSiteMapProvider GitHub プロジェクトの誰かが、MVC4 と mvcSiteMapProvider がシームレスに動作していると述べていたので、新しい MVC4 アプリを作成し、変更を加える前に mvcSiteMapProvider を追加してから、authorize グローバル フィルターを追加しました。すべてが期待どおりに機能したので、プロジェクトを比較して、どこが間違っているかを見つけました。この情報が誰かの役に立てば幸いですが、かなり特殊なケースであるため、疑わしいと思います。