私は自分のコードを何百万回もステップ実行しましたが、実装の問題を見つけることができません..
カスタム AuthorizeAttribute で 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) を呼び出すと、空白のページしか表示されません。だから私はベースが何をするかを反映しました、そしてそれはこれです
filterContext.Result = new HttpUnauthorizedResult();
したがって、Unauthorized.cshtml にリダイレクトする代わりに、空白のページをレンダリングする理由が説明されています。よくわからないのは、ベースを呼び出さないと無限ループに陥る理由です。
ps
間違った Unauthorized ビューを配置すると、エラーが発生することを確認しました (ただし、無期限にハングアップします)。
System.InvalidOperationException: The view 'Unauthorized11' or its master was not found or no view engine supports the searched locations