我有两个属性:
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
。