授权不在自定义authorizeattribute上工作

时间:2014-09-03 19:52:20

标签: asp.net-mvc iis asp.net-mvc-5 authorization custom-attributes

我为我的MVC控制器创建了一个非常简单的授权属性,该属性旨在重定向到一个控制器,允许显示未经授权的"消息:

public class ReportAuthorizeAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary
        {
            { "action", "ReportDenied" }
            , { "controller", "Authorization"}
        });
    }
}

我将它应用于我的主站点控制器:

[ReportAuthorize(Roles=@"Domain\GroupName")]
public class ReportController : Controller
{
     //etc
}

即使我在@" Domain \ GroupName"中,我也被赶出去了。事实上,如果我将其更改为Users = @" Domain \ MyUserName"它仍然失败!

我已将其跟踪到IIS设置匿名身份验证,该身份验证已为该站点启用。不幸的是,我不能在我们的生产系统上禁用匿名访问,因为这个项目是一个更大的MVC项目的一部分,其中许多其他控制器没有正确的属性。但是,当我在IIS中本地更改它时,我会正常进入。

现在,如果我改为普通的authorize属性:

[Authorize(Roles = @"Domain\GroupName")]
public class ReportController : Controller
{
    //etc
}

我进去(我假设因为我还没有定义任何未经授权的用户尝试连接时的特殊行为。)

有什么方法可以解决此属性问题?我只需要获取ReportsAuthorize属性即可正确验证用户身份,然后再将其作为匿名用户。

2 个答案:

答案 0 :(得分:0)

我原以为您要检查当前用户是否经过身份验证(filterContext.HttpContext.User.Identity.IsAuthenticated)。

如果没有,请拨打base.HandleUnauthorizedRequest,这可能最终会向Windows凭据发送质询。

如果用户已通过身份验证,请实施重定向逻辑。

话虽如此,使用标准AuthorizeAttribute并使用自定义错误显示“未授权”页面会不会更简单?

答案 1 :(得分:0)

好吧,经过一些疼痛,我终于解决了这个问题。请记住,部分问题在于此控制器位于较大的项目中,无法在IIS中禁用匿名身份验证。

这是控制器:

[ReportAuthorize(Users = @"domain\me,domain\etc", Roles = @"domain\groupname")]
[Authorize]
public class ReportController : Controller
{
    //etc
}

这是authorize属性:

public class ReportAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (Users.Contains(httpContext.User.Identity.Name) || Roles.Split(',').Any(s => httpContext.User.IsInRole(s))) //this if checks users and roles using OR logic
        {
            return true;
        }
        return false;
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary
        {
            {"action", "ReportDenied"}
            ,
            {"controller", "Authorization"}
        }); //this redirect sends you to a "not permitted" page
    }
}

我需要authorize属性才能让网站检查域并加载帐户信息。然后覆盖authorizationcore的自定义属性使用OR逻辑验证值(而不是默认AND逻辑,通过使用两个授权属性演示,其中一个包含您需要的用户/角色)。