MVC 4 AuthorizeAttribute.HandleUnauthorizedRequest ViewResult - Infinite Loop.
-
21-12-2019 - |
質問
私は私のコードを百万回毎に踏み出し、私の実装に問題が見つからない。
カスタムauthorizeAttribute iオーバーワーク2メソッド
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (!httpContext.Request.IsAuthenticated)
return false;
var routeData = httpContext.Request.RequestContext.RouteData;
var ctrl = routeData.Values["controller"].ToString();
var action = routeData.Values["action"].ToString();
var user = httpContext.User.Identity.Name;
_logger.Info("[logging all the details]");
return ctrl == "SomeController";
}
protected override void HandleUnauthorizedRequest(AuthorizationContext ctx)
{
ctx.Result = new ViewResult { ViewName = "Unauthorized" };
// base.HandleUnauthorizedRequest(ctx);
}
.
認証ロジックは特定のコントローラでのみfalseを返すようにモックされ、それを正しく機能していることを確認しました。
上記のコードは無限ループを引き起こします。私の丸太では、このラインが666回ヒット(一致していますか?)を打つことができます。
私がbase.handleUnauthorizedRequest(CTX)を呼び出すならば、私がget私がgetしているのは空白のページです。だから私は基地が何をしているものを反映していて、それはこの
ですfilterContext.Result = new HttpUnauthorizedResult();
.
だからこれは、Unauthorized.cshtmlにリダイレクトするのではなく、空白ページをレンダリングする理由を説明します。私が確信していないのは、ベースを呼び出さないのであれば無限ループに入るのですか。
p.S。
間違った不正なビューを置くと、それがエラー解除されます(しかしそれでも無期限にハングする)ことが確認されました
System.InvalidOperationException: The view 'Unauthorized11' or its master was not found or no view engine supports the searched locations
. 解決
これは私が続いていた実装であり、それは非常にうまく機能しています。
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
// this is overriden for kendo menus to hide
var ctrl = filterContext.RequestContext.RouteData.GetRequiredString("controller");
var action = filterContext.ActionDescriptor.ActionName;
[custom authorization logic on action/ctrl]
// useful to determine if it's authorizing current controller path or menu links
var path = filterContext.HttpContext.Request.PhysicalPath;
_authorizingCurrentPath = path.Contains(ctrl) || path.EndsWith("WebUI") ;
if (userAuth < requiredAuth)
HandleUnauthorizedRequest(filterContext);
}
protected override void HandleUnauthorizedRequest(AuthorizationContext ctx)
{
if (!ctx.HttpContext.User.Identity.IsAuthenticated)
base.HandleUnauthorizedRequest(ctx);
else {
if (_authorizingCurrentPath) {
// handle controller access
ctx.Result = new ViewResult { ViewName = "Unauthorized" };
ctx.HttpContext.Response.StatusCode = 403;
}
else {
// handle menu links
ctx.Result = new HttpUnauthorizedResult();
ctx.HttpContext.Response.StatusCode = 403;
}
}
}
. 他のヒント
の既定の実装authorizeattribute アクションコンテキストでの応答を設定します。これは、レスポンスが設定されず、レスポンスが設定されるまでフィルタが承認プロセスを繰り返すことはできません(したがって無限ループ)。
このロジックは authorizationFilterAttribute
を派生させるクラスのクラスで確認できます。所属していません StackOverflow