2017-09-27 5 views
0

asp.net mvcアプリケーションでHandleUnauthorizedRequestメソッドをオーバーライドして、ログインページにリダイレクトするのではなく、不正なajax呼び出しに401応答を送信するようにしました。これはローカルで実行するときちんとうまく動作しますが、IISにデプロイするとオーバーライドされたメソッドは呼び出されません。デバッグポイントは私のメソッドに全く当たらず、すぐにログインページにリダイレクトされます。IISにデプロイした後、カスタム権限属性が機能しない

これは私のコードです:

public class AjaxAuthorizeAttribute : AuthorizeAttribute 
    { 
     protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
     { 
      if (filterContext.HttpContext.Request.IsAjaxRequest()) 
      { 
       filterContext.HttpContext.Response.Clear(); 
       filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized; 

       filterContext.Result = new JsonResult 
       { 
        Data = new 
        { 
         success = false, 
         resultMessage = "Errors" 
        }, 
        JsonRequestBehavior = JsonRequestBehavior.AllowGet 
       }; 
       filterContext.HttpContext.Response.End(); 
       base.HandleUnauthorizedRequest(filterContext); 
      } 
      else 
      { 
       var url = HttpContext.Current.Request.Url.AbsoluteUri; 
       url = HttpUtility.UrlEncode(url); 
       filterContext.Result = new RedirectResult(ConfigurationManager.AppSettings["LoginUrl"] + "?ReturnUrl=" + url); 
      } 
     } 
    } 

と私は私のコントローラの上に属性[AjaxAuthorize]を宣言しました。一度IISに展開されると、何が違うのでしょうか?

更新:はここでも、それはAjaxのリクエストやログインセッションの有効期限が切れた後に簡単なページの更新だかどうかは関係ありません、私は、それは非常に簡単なテストだよ方法です -

  1. 私が展開私のローカルIISにサイト
  2. ホームページに移動 - "/ Home"
  3. "ログアウト"リンクを右クリックし、 "新しいタブで開く" - これにより、ホームページ現在のタブでまだ開いていますが、 セッションがログに記録されていますt。
  4. ホームページを更新します。ここで、デバッグポイントは私のオーバーライドされたHandleUnauthorizedRequestメソッドをヒットし、 if/else条件を通過して、ログインページにリダイレクトします。しかし、 はありません!単にログインページにリダイレクトするだけです。私は だと思っています。私のカスタム権限属性を考慮していないと思っています。

私はビジュアルスタジオからサイトを実行すると、すべて正常に動作し、コントロールは、オーバーライドされたメソッドでデバッグポイントを入力し、if/else条件を通過します。

+0

'IISにデプロイされたら何が違うのですか? - ConfigurationManager.AppSettings [" LoginUrl "]' - 設定ファイルをチェックしましたか? – NightOwl888

+0

はい、私はそれが「アカウント/ログイン」を指していることを確認しました。しかし、問題はIISに配備した後も、 "LoginUrl"の設定を完全に削除しても、コントロールが自分のカスタム属性の 'HandleUnauthorizedRequest'メソッドに入っていなくても、" Account/Login "にリダイレクトされます。私は展開した後でしかない。私は、デバッグとリリースの両方の設定でデプロイを試みましたが、同じ問題 –

答えて

0

IISにWebサイトを展開すると、IIS統合モードで既定で実行されます。通常はこれが最適です。しかし、それは、HTTP要求/応答モデルが認可チェック中に完全に初期化されていないことを意味します。私は、アプリケーションがIIS上でホストされている場合、IsAjaxRequest()が常にfalseを返すと思われます。

はまた、default HandleUnauthorizedRequest implementationは次のようになります。

protected virtual void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     // Returns HTTP 401 - see comment in HttpUnauthorizedResult.cs. 
     filterContext.Result = new HttpUnauthorizedResult(); 
    } 

を効果的に、あなたはデフォルトHttpUnauthorizedResultインスタンスに設定されているJsonResultインスタンスを上書きしているbase.HandleUnauthorizedRequest(context)を呼び出すことによって。

これらがフィルタと呼ばれる理由があります。それらは、ロジックの一部に入るリクエストをフィルタリングするためのものであり、実際にそのロジックを実行するためのものではありません。ハンドラ(ActionResult派生クラス)が作業を行うことになっています。

これを実行するには、フィルタが実行するロジックがHttpContextが完全に初期化されるまで待機するように、別のハンドラを作成する必要があります。

public class AjaxAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     filterContext.Result = new AjaxHandler(); 
    } 
} 

public class AjaxHandler : JsonResult 
{ 
    public override void ExecuteResult(ControllerContext context) 
    { 
     var httpContext = context.HttpContext; 
     var request = httpContext.Request; 
     var response = httpContext.Response; 
     if (request.IsAjaxRequest()) 
     { 
      response.StatusCode = (int)HttpStatusCode.Unauthorized; 

      this.Data = new 
      { 
       success = false, 
       resultMessage = "Errors" 
      }; 
      this.JsonRequestBehavior = JsonRequestBehavior.AllowGet; 
      base.ExecuteResult(context); 
     } 
     else 
     { 
      var url = request.Url.AbsoluteUri; 
      url = HttpUtility.UrlEncode(url); 
      url = ConfigurationManager.AppSettings["LoginUrl"] + "?ReturnUrl=" + url; 
      var redirectResult = new RedirectResult(url); 
      redirectResult.ExecuteResult(context); 
     } 
    } 
} 

注:上記のコードは未検証です。しかし、これはあなたが正しい方向に動くようにするはずです。

関連する問題