gpt4 book ai didi

c# - ASP.Net MVC : Can the AuthorizeAttribute be overriden?

转载 作者:行者123 更新时间:2023-11-30 19:14:26 24 4
gpt4 key购买 nike

我当前的项目是使用 ASP.Net MVC 构建的内部 Web 应用程序,我正在向其中添加身份验证。我有一个预构建的 HTTPModule,它创建了一个具有适当角色的 IPrincipal。如果用户未通过身份验证,我将获得一个角色为“Public”的用户对象

因为这是一个内部应用程序,所以大部分页面都是私有(private)的,只有“管理员”角色才能查看。因为我有一个基本 Controller ,所以我可以这样做:

[Authorize(Roles="Admin")]
public abstract class MyControllerBase : Controller
{
...
}

我有一个问题,因为有些操作可以在公共(public)网站上查看,如果我这样归因于它们:

[Authorize(Roles="Public")]
public class LoginController : MyController
{
public ActionResult Index()
{

}
}

由于用户未通过身份验证,页面无法加载。看起来“公共(public)在继承类上被忽略的角色。有谁知道角色是否可以被继承类覆盖?

我也试图避免将所有 Controller 归因于 Roles="Admin"

谢谢,基思。

最佳答案

您可以从 AuthorizeAttribute 派生一个新属性并覆盖 OnAuthorization 方法,然后应用您的自定义属性而不是 Authorize。下面是我的自定义属性之一的 OnAuthorization 方法,如果权限不足,它会重定向到错误页面,而不是重定向到登录页面。

不过,我不确定这能给您带来什么。当你用属性装饰你的类时,大概你必须允许 Admin 和 Public (所以你限制谁,因为 Public 是任何没有经过身份验证的人?)。然后,您必须装饰每个需要单独限制为 Admin 的 Controller 方法,因为 class 属性将允许访问,否则。您可以通过仅装饰那些非公开可用的方法(或没有公开可用方法的类)来使用常规 Authorize 属性实现此行为。

我想您可以让您的属性检查以查看被调用的方法是否也用属性修饰并简单地批准授权,这将有效地将授权推迟到方法级别。您可能必须查看 AuthorizationContext 上的 RouteData 以获取操作并使用反射尝试根据参数和请求类型找到合适的方法。

    public override void OnAuthorization( AuthorizationContext filterContext )
{
if (filterContext == null)
{
throw new ArgumentNullException( "filterContext" );
}

if (AuthorizeCore( filterContext.HttpContext ))
{
SetCachePolicy( filterContext );
}
else if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
// auth failed, redirect to login page
filterContext.Result = new HttpUnauthorizedResult();
}
else
{
ViewDataDictionary viewData = new ViewDataDictionary();
viewData.Add( "Message", "You do not have sufficient privileges for this operation." );
filterContext.Result = new ViewResult { MasterName = this.MasterName, ViewName = this.ViewName, ViewData = viewData };
}

}

protected void SetCachePolicy( AuthorizationContext filterContext )
{
// ** IMPORTANT **
// Since we're performing authorization at the action level, the authorization code runs
// after the output caching module. In the worst case this could allow an authorized user
// to cause the page to be cached, then an unauthorized user would later be served the
// cached page. We work around this by telling proxies not to cache the sensitive page,
// then we hook our custom authorization code into the caching mechanism so that we have
// the final say on whether a page should be served from the cache.
HttpCachePolicyBase cachePolicy = filterContext.HttpContext.Response.Cache;
cachePolicy.SetProxyMaxAge( new TimeSpan( 0 ) );
cachePolicy.AddValidationCallback( CacheValidateHandler, null /* data */);
}

关于c# - ASP.Net MVC : Can the AuthorizeAttribute be overriden?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/532773/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com