ASP.net MVC 全局授权筛选器强制登录允许匿名操作



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中更早地执行该过程。

相关内容

最新更新