すべてのコントローラのアクションにアクションフィルタを強制(C#/ ASP.NET MVC)

StackOverflow https://stackoverflow.com/questions/1343652

質問

Iは、セッション値に基づいて、コントローラのアクションへのアクセスを許可([承認]と同様属性、)新しいアクションフィルタを作りました。しかし、私は基本的に(非常に少数の例外を除いて)、その属性を持つすべての私のコントローラのアクションを飾っています。

だから、私は、コントローラのアクションに[ExemptFromAuthorize]属性を添付する場合には、アクションのを除いて常にの実行 をフィルタリングすることを持っている方が良いだろうと思いましたか? (多分私自身のコントローラクラスに継承経由?)

私はこれを行うことができますどのように?

役に立ちましたか?

解決

jeef3で実行こちらさんの答えは、私はこれを思い付きました。これは、複数の区切られたアクションのような多くのエラーチェックと堅牢性を使用することができますが、一般的なアイデアが動作します。

あなたの特定のケースでは、あなたがセッション値をテストし、また、認可外に返すように決めることができました。

public class AuthorizeWithExemptionsAttribute : AuthorizeAttribute
{
    public string Exemption { get; set; }
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext.RouteData.GetRequiredString("action") == Exemption)
            return;

        base.OnAuthorization(filterContext);
    }

}

使用方法:

[AuthorizeWithExemptions(Roles="admin", ExemptAction="Index")]
public class AdminController : Controller
...

他のヒント

CodeProjectの上で私の記事をチェックアウト -

http://www.codeproject.com/KB/web-security/ AuthorizeWithExemptions.aspxする

この記事では、私はすべてのアクションがあなたに安全でない定義したものを除いて固定されている方法で、ASP.NET MVCアプリケーションのコントローラーを確保するためのソリューションをご提供します。

コードからsnipper

public override void OnAuthorization(AuthorizationContext filterContext)
{
    ActionDescriptor action = filterContext.ActionDescriptor;
    bool IsUnsecured = action.GetCustomAttributes(
                         typeof(UnsecuredActionAttribute), true).Count() > 0;

    //If doesn't have UnsecuredActionAttribute - then do the authorization
    filterContext.HttpContext.SkipAuthorization = IsUnsecured;

    base.OnAuthorization(filterContext);
}

私は質問はかなり時代遅れであることを理解とにかくあなたはすべてのアクションにフィルタを適用したい場合は...ただのGlobal.asaxに以下の行を追加します:

protected void Application_Start()
{
    // your code here and then
    RegisterGlobalFilters(GlobalFilters.Filters);
}    

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new MyActionFilterAttribute());
}

とアクションは、次のように他の属性を持っている場合、アクションフィルターであなただけチェックすることができます:

public void OnActionExecuting(ActionExecutingContext filterContext)
{
    if (filterContext.ActionDescriptor.IsDefined(typeof(AnotherActionAttribute), false))
    {
        // do what you want to do
    }
}

たぶん試してみて、あなたの最初の属性にExceptプロパティを追加しますか?

[MyAuthenticate(Exempt="View")]
public class MyController : Controller
{
    public ActionResult Edit()
    {
        // Protected
    }

    public ActionResult View()
    {
        // Accessible by all
    }
}

あなたはそれがそのクラス内のすべてのメソッドに適用させるクラスに属性を追加することができます。

[Authenticate]
public class AccountController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}

私はクラスレベル属性から具体的な方法を除外するのか分かりません。たぶん、認証されていない要求のための別のコントローラを使用できますか?

  

2013+でこれを読んで、誰のために、MVC4は今の使用をサポートしています   【のAllowAnonymous

     

あなたは、コントローラ上の承認を入れて、[匿名に許可することができます   いずれかの機能は、あなたが認可する必要はありません。

     

例:

     

[承認]   パブリッククラスにHomeController:コントローラ{

[AllowAnonymous]
public ActionResult Index()
{

} 
     

}

カスタム[MyAuthorize]フィルタを持つこの作品はあるいはそれだけでは動作しないだろう[オーソライズ]

2013+でこれを読んで、誰のために、MVC4は現在、

[AllowAnonymous]の使用をサポートしています

あなたは、コントローラ上の承認を入れ、その後、あなたが認可したくない機能に匿名を許可することができます。

例:

[Authorize]
public class HomeController : Controller
{

    [AllowAnonymous]
    public ActionResult Index()
    {

    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top