web-dev-qa-db-ja.com

ActionName、ControllerName、およびArea Nameを取得し、Action Filter Attributeに渡します

次のようなカスタム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);
    }
}
_

私が持っている各アクションの上部でこのフィルターを使用します。また、「認証済み」チェックには、アクション名、コントローラー名、およびエリア名が必要です。 use _System.Web.HttpContextBase_のようなAuthorizeCore()メソッドでこの名前を取得する方法はありますか?答えがNoの場合、どのようにしてこの名前を取得して属性に渡すことができますか?明らかに、各名前を手動で追加したくないのは、実際にはコントローラの_ViewContext.RouteData.Values["Controller"]_のようなものです:

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

誰もそれについて考えていますか?

35
Saeid

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;

    ...

}
83
Darin Dimitrov

ほんの少し前に同じ問題に直面し、私の解決策は次のとおりです。

  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)
    {
     ...
    }
    
1
Mukhtiar Zamin
> 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();
>         }
> 
>     } }
0
change

カスタムフィルターを使用している場合、エリアを取得しても機能しません。次に、エリアを取得するために機能します

filterContext.RouteData.DataTokens["area"]
0
Eduardo Chávez