0

我创建了一个非常简单的授权属性对于我的MVC控制器,是为了重定向到一个控制器,允许显示一个“未授权”消息:授权不工作的自定义authorizeattribute

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

我将其应用到我的主站点控制器上:

[ReportAuthorize([email protected]"Domain\GroupName")] 
public class ReportController : Controller 
{ 
    //etc 
} 

即使我在@“Domain \ GroupName”中,我也会被踢出局。实际上,如果我将其更改为Users = @“Domain \ MyUserName”,它仍会失败!

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

现在,如果我换到正常的授权属性:

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

我得到了(我假设,因为我还没有定义,当未经授权的用户试图连接任何特殊的行为)。

我有哪些方法可以解决此属性问题?我只需要获取ReportsAuthorize属性,以在用户匿名之前正确认证用户。

回答

0

好的,所以在经历了一些痛苦和痛苦之后,我终于解决了这个问题。请记住,问题的部分原因是此控制器位于较大的项目中,因此无法在IIS中禁用匿名身份验证。

这里的控制器:

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

这里的授权属性:

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 
    } 
} 

我所需要的授权属性,使网站查询域和加载帐户信息。然后重写authorizationcore自定义属性验证使用或逻辑值(而不是默认的与逻辑,通过使用两个授权包含您需要的用户/角色属性中的一个证明)。

0

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

如果没有,请致电base.HandleUnauthorizedRequest这将可能最终会发送一个挑战Windows凭据。

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

说了这么多,是不是很简单的使用标准AuthorizeAttribute并使用自定义错误显示“未授权”页面?

+0

与标准authorizeattribute的问题是,如果我放下一组名我不是一个部分的它挑战我要我的凭据,但无法正确验证我和反复询问,直到我取消。 – 2014-09-03 20:04:32

+0

@CBauer - 如果提示是你的问题,然后是,进入自定义属性。根据我的经验,这不是一个问题,因为我会使用MvcSiteMapProvider之类的功能来启用安全修剪功能,以便用户看不到指向它们未授权的URL的链接。因此用户很少遇到提示。 – Joe 2014-09-04 10:01:01

+0

不幸的是,我试图保护的网页是通过直接链接传播的网站,如果我可以定位角色并让没有角色的人员转发到“您不被允许访问这个资源“页面。 – 2014-09-04 12:11:29