1

我有两个属性:

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标有 的操作AnonymousAllowedAttribute

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

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

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

第三个如下:

protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext){
   if(!httpContext.User.Identity.IsAuthenticated)
      return false;

   return CustomeCheck();
}

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

IIS 7.5 错误详情:

HTTP 错误 401.0 - 未经授权

使用此网址:http://myProject/Accounts/LogIn?ReturnUrl=%2f

问题出在哪里?怎样才能ActionAuthorizeAttribute实现这3个目标?

更新

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

4

1 回答 1

1

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

AnonymousAllowedAttribute继承时AuthorizeAttribute需要授权,但我创建它以减少授权!

于 2012-06-05T12:29:19.460 回答