我正在尝试使用我的新 MVC4 网站实现 MvcSiteMapProvider,但我遇到了一些我似乎无法修复的问题。
我使用 Active Directory 设置授权(目前没有角色提供程序),并且一切正常。当您尝试访问登录页面以外的任何页面时,您将被重定向到登录页面。Account 控制器的操作方法具有 [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,然后添加了授权全局过滤器。一切都按预期工作,所以我比较了项目并发现了哪里出错了。希望此信息对某人有所帮助,但我对此表示怀疑,因为这是一个非常独特的案例。