38

我使用自定义 AuthorizationFilter 如下:

public class ActionAuthorizeAttribute : AuthorizeAttribute {

protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext) {

        if(!httpContext.User.Identity.IsAuthenticated)
            return false;

        if(IsUserExcluded())
            return false;
        else
            return IsRoleAuthorize(httpContext);
    }
}

我在我拥有的每个操作的顶部使用此过滤器,并检查是否已授权,需要操作名称、控制器名称和区域名称。那么有什么方法可以在AuthorizeCore()use这样的方法中获取这些名称System.Web.HttpContextBase?如果答案是否定的,那么我如何获取这些名称并将其传递给属性,显然我不想手动添加每个名称,实际上就像ViewContext.RouteData.Values["Controller"]在控制器中一样:

[ActionAuthorize(actionName=Action, controller=ControllerName, area=AreaName)]
public ActionResult Index() {
    return View();
}

有人对此有任何想法吗?

4

5 回答 5

91

您可以从 RouteData 中获取它们:

protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext)
{
    var rd = httpContext.Request.RequestContext.RouteData;
    string currentAction = rd.GetRequiredString("action");
    string currentController = rd.GetRequiredString("controller");
    string currentArea = rd.Values["area"] as string;

    ...

}
于 2012-04-02T12:48:57.893 回答
1

刚才遇到同样的问题,我的解决方案是:

  1. 在 ActionAuthorizeAttribute 类中定义 2 个属性,例如

    public string ControllerName {get;set;}
    public string ActionName {get;set;}
    
  2. 在注释控制器的操作时指定它们,例如

    [ActionAuthorize(Roles="Admin", ContollerName="ControllerName",ActionName="ActionName")]**
    public ActionResult Disable(int id)
    {
     ...
    }
    
于 2014-08-18T07:27:21.747 回答
0

如果您使用自定义过滤器,则获取该区域将不起作用,下一个将用于获取区域

filterContext.RouteData.DataTokens["area"]
于 2017-08-22T02:23:56.083 回答
0
> namespace dene.kontroller {
>     public class daAttribute: AuthorizeAttribute
>     {
>         private Entities db = new Entities();
>         private readonly string[] allowedroles;
>         public daAttribute(params string[] roles)
>         {
>             this.allowedroles = roles;
>         }
> 
> 
>         protected override bool AuthorizeCore(HttpContextBase httpContext)
>         {
>             bool authorize = false;
>             foreach (var role in allowedroles)
>             {
>                 if (role == HttpContext.Current.User.Identity.Name)
>                 {
>                      
>                     if (role!= null)
>                     {
>                         authorize = true;
>                     }
>                 }
>                 
> 
>             }
>             return authorize;
>         }
> 
> 
>         protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
>         {
> 
>             FormsAuthentication.SignOut();
>             filterContext.Result = new HttpUnauthorizedResult();
>         }
> 
>     } }
于 2019-08-18T10:01:48.313 回答
0

如果获取区域不起作用,您可以通过以下方式从RouteData获取:

 string currentArea = string.Empty;
 if (rd.DataTokens.TryGetValue("area", out object area))
 {
     currentArea = area.ToString();
 }
于 2020-10-05T09:06:35.603 回答