1

新しいアプリケーションでは、MVC 3 から MVC 4 に切り替えています。サーバーからほとんどのコンテンツをフェッチするために Ajax を使用しています。MVC 3 では、web.config に次のものがありました。

    <authentication mode="Forms">
        <forms

            defaultUrl="Home/Index"
            protection ="All"
            slidingExpiration="true"
        />
    </authentication>

ユーザーが [Authorize] 属性にヒットした場合、ajax 呼び出しは「Unauthorized」エラーで失敗します。

    $.getJSON(
            url,function (data) {processAjaxCallResult(data);}
       )
       .fail(
             function (xhr, status, error)
             { handleAjaxCallError(xhr, status, error); }
       )
       .done(
             function () {completedAjaxCall();}
       );

次に、「handleAjaxCallError」がエラーをピックアップし、ユーザーが正しい MVC アクションにログインするように指示されていることを確認します。

同じ web.config を持つ新しい MVC 4 では、アプリケーションは login.aspx に移動しようとします。これはアプリケーションの一部ではありません。サーバーをこの存在しないページにリダイレクトすると、クライアントは内部サーバー エラーで動作を停止し、アプリが壊れます。

「無許可」エラーを取り戻すにはどうすればよいですか?

アップデート

Josh のアドバイスに従って、次のように HandleUnauthorizedRequest のオーバーライドを追加しました。

    protected override void HandleUnauthorizedRequest(AuthorizationContext context)
    {
        if ((context.RequestContext.HttpContext.Request.Headers)["X-Requested-With"] ==
            "XMLHttpRequest")
        {
            context.RequestContext.HttpContext.Response.StatusCode = 403;
        }
     }

これにより、以前の状況で 401 を行ったのと同じように処理できる "Forbidden" エラーが発生します。ただし、401 を設定して、存在しないログイン ページにリダイレクトされます。

さて、今のところ、アプリケーションを軌道に乗せたので、ジョシュが私のポイントです...

4

1 に答える 1

1

AuthorizeAttribute クラスから継承する独自の authorize 属性を作成できます。

public class CustomAuthorizeAttribute : AuthorizeAttribute

その中で、HandleUnauthroziedRequest をオーバーライドできます。

protected virtual void HandleUnauthorizedRequest(AuthorizationContext filterContext){
    // Return to JSON instead of following the authenticate route
}

カスタム属性を使用するには少し作業が必要ですが、認証プロセスを完全にカスタマイズできます。

于 2013-05-30T15:46:21.857 に答える