1

私はajaxpostアクションを使用しています。このアクションHttpContext.User.Identity.Nameでは、ユーザーIDを取得するために使用しました。ユーザーIDに基づいて、データベース内のそのユーザーIDに関連するいくつかのレコードを取得し、jsonタイプを介してその値を返します。

セッションが期限切れになることがありました。この場合、HttpContext.User.Identity.Name値は空になりました。空またはnullの場合、例外がスローされます。

したがって、HttpContext.User.Identity.Name値をnullまたは空にする必要があります。値がnullまたは空の場合は、ログインページにリダイレクトする必要があります。

ただし、リダイレクトアクションはajaxpostアクション内では機能しません。この問題を解決する方法は?

ajaxpostアクションを承認する必要があります。誰かがその解決策を与えることができますか?

よろしく、
Karthik。

4

1 に答える 1

3

ただし、アクションのリダイレクトは 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
    }
});
于 2012-05-16T11:55:48.757 に答える