新しいasp.net mvc 4.0アプリケーションを作成するとき、最初に行うことglobal filter
の1つは、次のようにカスタム承認を作成して設定することです。
//FilterConfig.cs
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//filters.Add(new HandleErrorAttribute());
filters.Add(new CustomAuthorizationAttribute());
}
次に、次のCustomAuthorizationAttribute
ように作成します。
//CustomAuthorizationAttribute.cs
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
//Handle AJAX requests
filterContext.HttpContext.Response.StatusCode = 403;
filterContext.Result = new JsonResult { JsonRequestBehavior = JsonRequestBehavior.AllowGet };
}
else
{
//Handle regular requests
base.HandleUnauthorizedRequest(filterContext); //let FormsAuthentication make the redirect based on the loginUrl defined in the web.config (if any)
}
}
私は2つのコントローラーを持っています:HomeController
そしてSecureController
HomeController は[AllowAnonymous]
属性で装飾されています。
SecureController は属性で装飾されていません。[AllowAnonymous]
のIndex() ActionResult
はHomeController
、単純なボタンを含むビューを表示します。
SecureController
ボタンをクリックすると、次のような内部に存在する GetData() メソッドへの ajax 呼び出しを行います。
$("#btnButton").click(function () {
$.ajax({
url: '@Url.Action("GetData", "Secure")',
type: 'get',
data: {param: "test"},
success: function (data, textStatus, xhr) {
console.log("SUCCESS GET");
}
});
});
言うまでもなく、ボタンをクリックすると、グローバル フィルターであるだけでなく、 が属性で装飾されていないCustomAuthorizationAttribute
ため、 がトリガーされます。SecureController
[AllowAnonymous]
よし、自己紹介終わった…
の導入により、認証フィルターの前にたまたまトリガーasp.net mvc 5.0
される新しい機能が導入されました(これは優れており、認証されていないユーザー (http 401) と認証されていないユーザーを区別する方法をより細かく制御できます)。認証されていて、たまたま承認されていない人 (http 403))。authentication filter
この新しいauthentication filter
機能を試すために、新しい asp.net mvc 5.0 (VS Express 2013 for Web) を作成し、次のことから始めました。
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//filters.Add(new HandleErrorAttribute());
filters.Add(new CustomAuthenticationAttribute()); //Notice I'm using the word Authentication and not Authorization
}
次に、属性:
public class CustomAuthenticationAttribute : ActionFilterAttribute, IAuthenticationFilter
{
public void OnAuthentication(AuthenticationContext filterContext)
{
}
public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext)
{
var user = filterContext.HttpContext.User;
if (user == null || !user.Identity.IsAuthenticated)
{
filterContext.Result = new HttpUnauthorizedResult();
}
}
}
を作成しましたHomeController
。は属性HomeController
で装飾されています。[AllowAnonymous]
VS 2013 からアプリケーションを起動する前に、CustomAuthenticationAttribute (OnAuthentication
およびOnAuthenticationChallenge
) の両方のメソッド内に 2 つのブレーク ポイントを設定しました。
アプリケーションを起動すると、最初のブレーク ポイント ( OnAuthentication
) にヒットします。次に、驚いたことに、 内のコードIndex() ActionResult
がHomeController
実行され、View() を返した後でのみ、メソッドのブレーク ポイントに到達しOnAuthenticationChallenge()
ます。
質問: 2 つの質問があります。
質問 1)属性は自動的にコードをバイパス
するという印象を受けましたが、それは間違いでした! 属性の存在を手動で確認し、コードをスキップする必要がありますか?[AllowAnonymous]
CustomAuthenticationAttribute
[AllowAnonymous]
Index()
質問 2) myの my メソッド内のコードが の後にHomeController
実行されるのはなぜですか? View() を返した後、内部のコードが実行されることに気付くだけですか?OnAuthentication
OnAuthenticationChallenge()
Index()
私の懸念は、ユーザーが認証されていない場合にメソッドのコードを実行したくないということです。
おそらく、私はこれを間違った方法で見ています。
誰かがこれに光を当てるのを手伝ってくれるなら、それは素晴らしいことです!
敬具ヴィンス