新しいアプリケーションでは、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 を設定しても、存在しないログイン ページにリダイレクトされます。
さて、今のところ、アプリケーションを軌道に乗せたので、ジョシュが私のポイントです...