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);
    }
}

私はこのフィルターを各アクションの上部で使用します。Is Authorized をチェックするには、アクション名、コントローラー名、およびエリア名が必要です。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 に答える