ただし、アクションのリダイレクトは ajax post アクション内では機能しません。この問題を解決するには?
コントローラ アクションを[Authorize]
属性で装飾することから始めることができます。これにより、認証されたユーザーのみがアクセスできるようになり、内部User.Identity.Name
が決して null にならないことが保証されます。
[Authorize]
public ActionResult SomeAction()
{
string username = User.Identity.Name; // this will never throw
...
return Json(...);
}
次に、Phil Haack による次のブログ投稿をご覧ください。その投稿の中で、Phil は、保護されたアクションへの AJAX 要求が行われたときに 401 HTTP ステータス コードを送信するように ASP.NET を構成できる優れたプラグインを提示しています。したがって、jQuery コードでは、この状態を非常に簡単に検出してリダイレクトできます。
$.ajax({
url: '/SomeAction',
type: 'POST',
statusCode: {
200: function (data) {
alert('200: Authenticated');
// Bind the JSON data to the UI
},
401: function (data) {
// the user is not authenticated => redirect him to the login page
window.location.href = '/login';
}
}
});
そしてもちろん、すべての AJAX リクエストでこの 401 条件を記述することを避けるために.ajaxError()
、サーバーから 401 ステータス コードが返された場合に、グローバル ハンドラーを使用して、すべての AJAX リクエストのこのリダイレクト ロジックを簡単に集中化できます。
$(document).ajaxError(function(e, jqxhr, settings, exception) {
if (jqxhr.status == 401) { // unauthorized
window.location.href = '/login';
}
});
そして今、あなたのAJAXリクエストはかなり標準的になります:
$.ajax({
url: '/SomeAction',
type: 'POST',
success: function(data) {
// do something with the data returned by the action
}
});