c# - HandleUnauthorizedRequest 未覆盖

标签 c# asp.net-mvc-3 asp.net-membership authorization

在我的 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

这就是我想要做的。我有一个工作正常的登录页面(表单验证)——它调用我的自定义登录,然后调用我的 AuthorizeCore 覆盖。我的应用程序使用大量的 ajax 调用,我的最终目标是每当用户使用该应用程序时,管理员禁用它们,在禁用后进行 ajax 调用(尽管仍在登录)应该将它们注销。但是,为了做到这一点,如果用户正在进行 ajax 调用,我想返回一个自定义响应,为此,我需要 ovverride HandleUnauthorizedRequest。但是,如果用户已登录,我的授权核心(以及扩展的 HandleUnauthorizedRequest)将被忽略(尽管我在 ajax 调用的所有 Controller 操作上都有 customauthorize 标签)。

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

最佳答案

我最终稍微改变了我的方法。我实现了单独的权限检查,然后导致 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")]

关于c# - HandleUnauthorizedRequest 未覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11088381/

相关文章:

c# - 带有脚本组件和服务引用的 SSIS

c# - 如何抑制整个命名空间文件的 StyleCop 警告

asp.net-mvc - 服务层内部的成员资格提供者

linq-to-sql - 如何围绕 Membership.CreateUser 封装事务?

c# - C# 中的简单优先级队列 - 使用自定义排序器 : IComparer? 会比 List 更好

c# - MVC 5 和 Unity IoC 中的 AccountController

asp.net-mvc-3 - MVC3 中的富文本区域

c# - 服务的 ASP.NET MVC 设计模式最佳实践

asp.net-mvc-3 - ajax-防止双击提交

c# - 重置密码恢复状态