7

ユーザーが認証されていない場合、ユーザーをサインインページに転送するCustomeAuthorizeアクションフィルターがあります。私はアクションやコントローラにこのフィルタを適用します。ASP.NET MVC - 外部Webサイトを使用してユーザーにログオンするためのCustomeAuthorizeフィルターアクション

[CustumeAuthorize] 
public ActionResult MyAction() 
{ 
    //do something here 
    return View(); 
} 

とフィルタ次のようになります。

public class CustomAuthorizeAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 

     if (!currentUserIsAuthenticated) 
     { 

      filterContext.Result = 
       new RedirectToRouteResult(
        new RouteValueDictionary{{ "controller", "Account" }, 
               { "action", "SignIn" }, 
               { "returnUrl", filterContext.HttpContext.Request.RawUrl } 
               }); 
     } 
     else 
     { 
      base.OnActionExecuting(filterContext); 
     } 
    } 
} 

私はfilterContext.Resultに値を代入すると、フィルタの仕上げの実行後、実行は(何とか?!)サインインアクションにリダイレクトされますMyActionは実行されません。これはまさに私が欲しいものです。その実行後

public class CustomAuthorizeAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 

     if (!currentUserIsAuthenticated) 
     { 
      filterContext.HttpContext.Response.Redirect("http://externalSite.com/login?returnUrl=" + filterContext.HttpContext.Request.RawUrl); 
     } 
     else 
     { 
      base.OnActionExecuting(filterContext); 
     } 
    } 
} 

私の問題がある

は今、私は、私はこのような何かをやっている私自身のサインインアクション外部のWebサイトに対してではなく、ユーザーを認証するために、私のCustomAuthorizeを変更したいと言いますCustomAuthorizeの2番目のバージョンのフィルタが終了したら、実行はMyActionに進みます。これは私が望んでいないものです!この場合、フィルタ後にMyActionの実行を停止するにはどうすればよいですか?

-Update-私はちょうど新しい問題に出くわしました。 )

string url = "http://externalSite.com/login?returnUrl=" + filterContext.HttpContext.Request.RawUrl; 
filterContext.HttpContext.Response.Write("<script type=\"text/javascript\">\ntop.location.href = \"" + url + "\";</script>"); 

RedirectResult(JavaScriptを渡す方法はあります:私のMVCアプリケーションは、iframe内にあると私はリダイレクトは、リダイレクト後にメインフレームとして現在のフレームを強制したいので、私のような何かをしています?

答えて

11

フィルタコンテキストで結果を置き換える前にRedirectToRouteResultを使用していたのと同様のRedirectResultを使用します。

filterContext.Result = new RedirectResult("http://externalSite.com/login?returnUrl=" + filterContext.HttpContext.Request.RawUrl); 
+1

は先端をありがとうございました。私はちょうど新しい問題を見つけました。 MVCアプリケーションはiFrameにあり、リダイレクト後に現在のフレームをメインフレームとして強制的にリダイレクトしたいので、私は次のようにしています。 filterContext.HttpContext.Response.Write( ""); RedirectResult()にJavaScriptを渡す方法はありますか? – xraminx

+0

リダイレクトを行うために正しいJavascriptを含む実際のViewを返すことをお勧めします。あなたも試してみることができるJavaScriptResultがあります。私はそれを使わなかった。 – tvanfosson

+0

JavaScriptResultは返されたJavaScriptを

ブロック内に書き込みます!理由は分かりません。 私は単純に私のために転送し、上記の最初のケースと同じようにそのアクションに転送されたダミーアクションを作成しました。あなたの助けをありがとう:) –
                        
                            
    xraminx
                                
                            
                        
                    

1

あなたがiFrameを持っていて、このiFrame内でアクションを実行していることが分かりましたら教えてください。そのiFrame内ではなく、親ページにリダイレクトしたいのですか?

もしそうなら、あなたの行動にはリダイレクト(URL)を使用してください。

+0

iFrameからのリダイレクト(URL)は、iFrameにURLを入れます。 – Dronz

0

ログインページでjQueryで判定を追加できます。

$(function() { 
     if (window != top) { 
      top.location.href = location.href; 
     } 
    }); 

OR

編集アクションの 'filterContext.Result' 'OnActionExecuting'

filterContext.Result = new ContentResult() { Content = "<script>top.window.location.href='/user/Login'</script>" }; 
関連する問題