Setup (使用 MVC 4)
public class MyAuthorizeAttribute : AuthorizeAttribute {
protected override bool AuthorizeCore(HttpContextBase httpContext) {
var isAuthorised = base.AuthorizeCore(httpContext);
if(isAuthorised) {
// retrieve authentication ticket from cookie and
// create custome principal and attach to
// httpContext.User
}
return isAuthorised;
}
}
Gloabl.asax.cs:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new MyAuthorizeAttribute());
}
首页控制器.cs:
using System.Web.Mvc;
public class HomeController : Controller
{
[AllowAnonymous]
public ActionResult Index()
{
return View();
}
}
问题
对主页的调用会强制加载登录页面。
问题
当 HomeController.Index() 操作用 [AllowAnonymous] 装饰时,为什么 ASP 会将我重定向到登录视图?
我用这篇文章作为参考
根据我对原始问题的评论。问题是索引视图正在调用返回部分视图的其他控制器上的操作。只是遍历所有内容并去除旧的 [授权] 属性的情况。
尽管原始海报已经找到了他案件的原因,但我想分享我的解决方案,因为我在面对相同的症状时遇到了这个问题。
在我的web.config文件中,我遵守网络表单的逻辑:
<authorization>
<deny users="?" />
</authorization>
您不能这样做,因为它会阻止请求在没有先登录的情况下执行任何操作,但发生重定向的登录操作除外。当我尝试添加第二个公共操作时,我才发现这一点。
我遇到了类似的问题,最后我用错了AllowAnonymousAttribute
类。有两个 AllowAnonymousAttribute 类:
- 一个来自
System.Web.Http
命名空间 - 另一个来自
System.Web.Mvc
命名空间
在您的情况下,您当然必须使用System.Web.Mvc
:)
我花了超过一个小时在我的程序中弄清楚它
虽然这不是答案,但..
尝试使用内置的Authorize
代码,并确保AllowAnonymous
工作正常。我在您的自定义授权评论中看到您正在尝试
从 cookie 中检索身份验证票证并创建自定义 主体并附加到 httpContext.User
我建议您在此线程中指定的Global.asax.cs
Application_AuthenticateRequest
中更早地执行该过程。