私のプロジェクトではWIFを使用しています(ただし、これはこの質問のコンテキストではそれほど重要ではありません。認証を処理する代替フレームワークを使用できます。質問は、ajaxリクエストの実行中の認証失敗の処理に関するものです)。それにもかかわらず、私の場合、から継承しClaimsAuthenticationManager
、認証を処理するカスタム サーバー ロジックを作成しました。
public override IClaimsPrincipal Authenticate(string resourceName, IClaimsPrincipal incomingPrincipal)
{
if (incomingPrincipal != null && incomingPrincipal.Identity.IsAuthenticated)
{
// add some custom claims
}
return incomingPrincipal;
}
ここで、すべてのSession Cookiesを削除し、終了して任意のページに再び入ると、WIF が提供するログイン ページにリダイレクトされ、再度ログインするように要求されます。すべてが期待どおりに機能します。
しかし、代わりにajax リクエストを行うと、エラーが発生します。これは次のようにインターセプトされます。
$(document).ready(function () {
$.ajaxSetup({
error: function (XMLHttpRequest, textStatus, errorThrown) {
// do something
}
});
});
残念ながら、XMLHttpRequest
オブジェクトは意味のあるメッセージを返しません。これに基づいて、この種のエラーを他の方法で処理できます。この特定のケースでは、通常のリクエストと同様に、アプリケーションをログイン ページにリダイレクトさせたいだけです。
ajax 呼び出しの実行中に、メソッドAuthenticate
fromClaimsAuthenticationManager
が呼び出されます。Identity.IsAuthenticated
false を返し、メソッドが終了し、すべてが完了します。OnAuthorization
メソッド fromもBaseController
呼び出されないため、ajax の結果オブジェクトにステータスを渡すことができません。
protected override void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.IsAjaxRequest() && !User.Identity.IsAuthenticated)
{
//do something, for example pass custom result to filterContext
}
base.OnAuthorization(filterContext);
}
パズルを解くには?