7

filterConfig で、メソッドごとに承認が必要なグローバル属性フィルターを登録しました。

ただし、別の承認フィルター属性を適用する特定の方法が 1 つあります。可能であれば、どのようにこれを達成しますか?

注: [AllowAnonymous] 属性 (これはシームレスに機能し、フィルターを完全に無視します) は使用したくありません。これは、メソッドの異なる一連の承認ロジックを介して要求を承認する必要があるためです。

4

2 に答える 2

6

AllowMultiple = true属性クラスの属性を設定することで複数を許可するようにフィルターを変更しAttributeUsage、フィルターが複数回存在する場合にグローバルに適用されたフィルターが実行されないようにチェックを追加できます。にActionExecutingContext渡される をOnActionExecuting()使用すると、 を介して適用されるフィルタを取得filterContext.ActionDescriptor.GetCustomAttributes()できるため、ここでそれを使用できます。

次に、コンストラクターを変更して、使用する認証方法を決定するために使用できるパラメーター (おそらく列挙型) を渡すことができるようにします。そのパラメーターに、通常の認証方法を選択するデフォルト値を指定します。次に、別の認証方法を必要とする 1 つの方法で、パラメーターの他の値を使用してフィルターを適用できます。したがって、次のようになります。

public class CustomAuthAttribute : AuthorizeAttribute
{
    public CustomAuthAttribute(AuthMethod method = AuthMethod.StandardAuth)
    {
        //stuff
    }
}

[CustomAuth(AuthMethod.WeirdAuth)]
public ActionResult MethodThatNeedsDifferentAuth()
{
    //stuff
}
于 2013-03-27T17:13:22.280 に答える
3

独自のバージョンの authorize 属性を記述し、属性に実行させたいアクションに応じて特定のパラメーターを渡すことができます。

public class CustomAuthorizeAttribute : AuthorizeAttribute
   {
        public string currentAction { get; set; }
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
           if (currentAction != "notallowed")
            {
                HandleUnauthorizedRequest(filterContext);
            }
        }
    }

 protected override void HandleUnauthorizedRequest(AuthorizationContext context)
    {
        context.Result = new RedirectResult("/home/login");
    }

そして、それをクラスまたはアクションに適用します

[CustomAuthorize(currentAction = "notallowed")]
public class HomeController : Controller
于 2013-03-27T16:59:38.680 に答える