具有排除属性的全局自定义授权属性

时间:2012-06-05 08:32:26

标签: asp.net-mvc asp.net-mvc-3 authorization action-filter authorize-attribute

我有两个属性:

public class AnonymousAllowedAttribute : AuthorizeAttribute { }

public class ActionAuthorizeAttribute : AuthorizeAttribute { 

  public override void OnAuthorization(AuthorizationContext filterContext) {

    bool skipAuthorization =
        filterContext.ActionDescriptor.IsDefined(typeof(AnonymousAllowedAttribute), true)
        ||
        filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AnonymousAllowedAttribute), true);
        if(!skipAuthorization)
            base.OnAuthorization(filterContext);
  }


  bool CustomeCheck() {
    bool result = //My Checks
    return result;
   }
}

我将ActionAuthorizeAttribute定义为全局属性。

所以我需要这3项:

1-如果没有登录(!User.Identity.IsAuthenticated):转到登录页面Accounts/LogIn。 我必须提及标有LogIn的{​​{1}}操作。

2-如果登录(AnonymousAllowedAttribute)且操作或控制器有User.Identity.IsAuthenticated,则授权为真(不需要任何授权)。

3-如果登录(AnonymousAllowedAttribute)并且操作没有User.Identity.IsAuthenticated返回AnonymousAllowedAttribute方法

如您所见,我通过覆盖CustomeCheck()方法尝试第二个。

和第三个如下:

OnAuthorization()

但是当我没有登录时总是返回:

IIS 7.5错误详细信息:

HTTP错误401.0 - 未经授权

使用此网址:protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext){ if(!httpContext.User.Identity.IsAuthenticated) return false; return CustomeCheck(); }

问题在哪里?如何实现http://myProject/Accounts/LogIn?ReturnUrl=%2f来实现这3个目标?

更新

我找到答案:问题是:ActionAuthorizeAttribute需要继承AnonymousAllowedAttribute而不是Attribute

1 个答案:

答案 0 :(得分:1)

问题是:AnonymousAllowedAttribute需要继承Attribute而不是AuthorizeAttribute

AnonymousAllowedAttributeAuthorizeAttribute继承,所以需要授权,但我创建了以减少授权!!