当前位置: 首页 > 编程语言 > C#

ASP.NetMVC:是否可以覆盖AuthorizeAttribute?

时间:2023-04-11 11:27:12 C#

ASP.NetMVC:是否可以覆盖AuthorizeAttribute?我当前的项目是使用ASP.NetMVC构建的内部Web应用程序,我正在添加身份验证。我有一个预构建的HTTPModule,它创建一个具有适当角色的IPrincipal。如果用户未通过身份验证,我会得到一个角色为“Public”的用户对象,因为这是一个内部应用程序,大多数页面都是私有的,只能使用角色“Admin”查看。因为我有一个基本控制器,所以我可以这样做:[Authorize(Roles="Admin")]publicabstractclassMyControllerBase:Controller{...}将它们分组为:[Authorize(Roles="Public")]publicclassLoginController:MyController{publicActionResultIndex(){}}页面无法加载,因为用户未通过身份验证。看起来像“继承类忽略公共”效果。有谁知道角色是否可以被继承的类覆盖?我也试图避免使用Roles="Admin"来归因于所有控制器谢谢,基思。您可以从AuthorizeAttribute派生新属性并覆盖OnAuthorization方法,然后应用您的自定义属性而不是授权。下面是我的自定义属性之一的OnAuthorization方法,如果权限不足,它会重定向到错误页面而不是登录页面。不过,我不确定这会给你带来什么。当您使用属性装饰您的类时,您可能必须同时允许Admin和Public(因此,您要限制谁,因为Public是任何未经过身份验证的人?)。然后,您必须装饰每个需要单独限制为Admin的控制器方法,因为类属性将允许访问。您可以使用普通的Authorize属性来实现此行为,只需修改那些不公开可用的方法(或没有公开方法的类)即可。我想你可以检查属性,看看被调用的方法是否也用属性修饰,然后只批准授权,这将有效地将授权推迟到方法级别。您可能需要查看AuthorizationContext上的RouteData以获取操作,并使用反射尝试根据参数和请求类型找到合适的方法。publicoverridevoidOnAuthorization(AuthorizationContextfilterContext){if(filterContext==null){thrownewArgumentNullException("filterContext");}if(AuthorizeCore(filterContext.HttpContext)){SetCachePolicy(filterContext);}elseif(!filterContext.HttpContext.User.Identity.IsAuthenticated){//认证失败,重定向到登录页面filterContext.Result=newHttpUnauthorizedResult();}else{ViewDataDictionaryviewData=newViewDataDictionary();viewData.Add("Message","您没有足够的权限执行此操作。");filterContext.Result=newViewResult{MasterName=this.MasterName,ViewName=this.ViewName,ViewData=viewData};}}protectedvoidSetCachePolicy(AuthorizationContextfilterContext){//**重要**//由于我们在操作级别执行授权,因此授权代码在输出缓存模块之后运行//。在最坏的情况下,这可能允许授权用户//到c使页面被缓存,然后未经授权的用户稍后将获得//缓存的页面。我们通过告诉代理不要缓存敏感页面来解决这个问题,//然后我们将自定义授权代码挂接到缓存机制中,以便我们对是否应从缓存提供页面有最终决定权。HttpCachePolicyBasecachePolicy=filterContext.HttpContext.Response.Cache;cachePolicy.SetProxyMaxAge(newTimeSpan(0));cachePolicy.AddValidationCallback(CacheValidateHandler,null*/);最后,我认为我的答案是,在问题中我没有将Authorize属性放在我的基本控制器上,而是派生了一个新的AdminBaseController。[HandleError]publicabstractclassMyControllerBase:Controller{...}[Authorize(Roles="Admin")]publicabstractclassAdminControllerBase:MyControllerBase{....}任何需要身份验证的控制器现在都可以从AdminControllerBase和我的公共派生控制器可以派生自MyControllerBase。面向对象的救援。以上是C#学习教程:ASP.NetMVC:CanAuthorizeAttributebeoverridden?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: