HandleUnauthorizedRequest

HandleUnauthorizedRequest

在我的asp.net mvc3应用程序中,我具有一个自定义授权属性,如下所示。

public class CustomAuthorize : AuthorizeAttribute
{
    public IAccountRepository AccountRepository { get; set; }

    public CustomAuthorize()
    {
        this.AccountRepository = new UserModel();
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        base.AuthorizeCore(httpContext);
        return AccountRepository.isEnabled(HttpContext.Current.User.Identity.Name);
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        base.HandleUnauthorizedRequest(filterContext);
    }
}

我在 Controller 操作上添加了[CustomAuthorize]标记,并且AuthorizeCore方法可以正常工作-它执行我希望它执行的逻辑(确保确实启用了帐户),然后按原样返回。

但是,覆盖的HandleUnauthorizedRequest方法根本无法运行,据我所知,该方法应允许我控制未经授权的请求的行为。我在其中放置了一个断点,我在其中放置了代码,我未经授权访问了我的应用程序,并且该代码永远无法运行。

我想念什么?

编辑:我进行了更多的研究,发现还有其他一些有此问题的人,但不幸的是没有解决方案。

EDIT2:示例代码
[CustomAuthorize]
public class UserController: Controller
{
    public UserController()
    {
        //do stuff here
    }
}

编辑3:@Fabio

这就是我想要做的。我有一个工作正常的登录页面(forms auth)-它调用我的自定义登录名,然后调用我的AuthorizeCore覆盖。我的应用程序使用了大量的Ajax调用,而我的最终目标是在用户使用该应用程序时将其禁用,管理员在禁用(尽管仍在登录)后进行ajax调用应将其注销。但是,为了做到这一点,如果用户正在进行ajax调用,我想返回一个自定义响应,为此,我需要使用ovverride HandleUnauthorizedRequest。但是,如果用户登录,我的Authorize Core(以及扩展名HandleUnauthorizedRequest)将被忽略(尽管事实是我在ajax调用的所有 Controller 操作上都具有customauthorize标签)。

简而言之:我想在每个请求上授权用户,而不仅仅是登录请求(这似乎是成员资格提供者当前正在做的事情)

最佳答案

我最终改变了自己的方法。我实现了单独的权限检查,然后导致了每次都调用AuthorizeCore(并且没有被缓存,我猜这是之前发生的事情)。

有趣的是,在HandleUnauthorizedRequest覆盖上放置一个断点仍然不会中断,但是将其放置在方法内将是可以的。很奇怪,把我甩了一下,但现在我已经解决了。

代码是否有人感兴趣:

public class CustomAuthorize : AuthorizeAttribute
{
    public string Permissions { get; set; }

    private IAccountRepository AccountRepository { get; set; }

    private string[] permArray { get; set; }

    private string reqStatus { get; set; }

    public CustomAuthorize()
    {
        this.AccountRepository = new UserModel();
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        base.AuthorizeCore(httpContext);

        if (Permissions != null) {
            permArray = Permissions.Trim().Split(' ');

            if (AccountRepository.isEnabled(httpContext.User.Identity.Name)) {
                this.reqStatus = "permission";
                return AccountRepository.hasPermissions(permArray);
            } else {
                return false;
            }
        } else {
            return AccountRepository.isEnabled(httpContext.User.Identity.Name);
        }
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if (this.reqStatus == "permission") {
            filterContext.Result = new RedirectResult(MvcApplication.eM.cause("no_permission", "redirect"));
        } else {
            base.HandleUnauthorizedRequest(filterContext);
        }
    }
}

然后我用这个装饰 Controller :
[CustomAuthorize(Permissions="test_perm")]

10-06 15:44