3

ASP.NET4.0とMVC3.0

状況は次のとおりです。MVCとASP.NETを初めて使用し、web.configでFormAuthenticationを使用するMVCアプリケーションを使用しています。

<authentication mode="Forms">
   <forms loginUrl="~/LogOn/LogOn" timeout="2" requireSSL="true" />
</authentication>

また、通常は、セッションの有効期限が切れた後にユーザーがページに移動すると、ログオンページに移動します。これは正常に機能します。私がやろうとしているのは、リクエストがAjax呼び出しの場合にそのページが返送されないようにし、代わりに失敗を示すためにJSONオブジェクトを返送することです。
以下を介してXMLHttpタイプをチェックし、リクエストをキャッチするところまで到達しました。

void MvcApplication_AuthenticateRequest(object sender, EventArgs e)
{
        if (s_identityProvider == null)
            return;
        IClaimsPrincipal principal = GetClaimsPrincipal();
        Context.User = principal;
        if (principal != null)
            ClaimProvider.CheckAndPopulateRoles(principal);
        else
        {
            if (Context.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
            {
                Context.Response.Write( "<?xml version='1.0' encoding='ISO-8859-1'?>"+
                                        "<note>"+
                                        "</note>";
            }
            else
            {
                FormsAuthentication.SignOut();
            }
        }
}

今、私はAJAX呼び出しのチェックが機能しているように見えることをテストしました。奇妙なのは、キャッチ後、ログインページがまだ応答として送信されることだけです。私はFormsAuthenticationメソッドのすべての使用をチェックして、他の誰も強制していないことFormsAuthentication.RedirectToLoginPage()を確認し、実際、FormsAuthenticationのすべての使用をチェックし、奇妙なことをしている人はいません。ログインページのURLのクエリ(経由GetRedirectUrl())も確認しましたが、まだ何もありません。

誰かが自動リダイレクトを何をするのか考えていますか?

4

1 に答える 1

0

私の唯一の推測は、AuthenticateRequestメソッドがここでのリクエストのライフサイクルの終わりではないということです。その結果、Response最終的にユーザーに返されるのはリダイレクト応答です。ResponseMVC フレームワークによるそれ以上の操作を回避するために、AJAX 応答をキャッチして変更した後は、明示的に終了する必要があります。

if (Context.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
{
    Context.Response.Write( "<?xml version='1.0' encoding='ISO-8859-1'?>"+
                            "<note>"+
                            "</note>";
    Context.Response.End(); // Calling End here should complete the response.
 }
 else {
            // ... other stuff
 }
于 2012-08-20T19:17:50.363 に答える