2

私は、ajaxログイン要求を処理するApiControllerを持っています。以下のコードで何が起こっているかである。SignInManager.SignInPasswordAsyncがApiControllerのユーザーにログインしていません

// I tried with HttpContext.Current.GetOwinContext().Get... and it didn't work either 
private ApplicationUserManager userManager => Request.GetOwinContext().Get<ApplicationManager>(); 
private ApplicationSignInManager signInManager => Request.GetOwinContext().Get<ApplicationSignInManager>(); 

public async Task<IHttpActionResult> Login(LoginJson request) 
{ 
    var user = await userManager.FindByEmailAsync(request.Email); 
    var result = await signInManager.PasswordSignInAsync(user.UserName, request.Password, true, true); 

    if (result == SignInStatus.Success) 
    { 
     if (!User.Identity.IsAuthenticated) 
     { 
      throw new Exception("Why are you not authenticating!!!"); 
     } 
    } 
    return Ok(); 
} 

その例外は常にスローされる(すなわち、結果は、ユーザーがまだ認証されていないことをSuccess、まだIPrincipalレポートです)。

何でも奇妙であることは、私はページをリロード場合、私はは、前の要求が実際にユーザーがログインした意味、ダッシュボードページ(ダッシュボードは、認証されたユーザのデフォルトのホームページです)に連れて行かだということである。しかし、その後、なぜUser.Identity.IsAuthenticatedは私の最初のログイン要求でfalseを返しますか?何か案は?

注:これはのみApiControllerために起こっている、通常のMVC Controllerは正しく

答えて

3

認証クッキーにユーザーをログインコントローラがクライアント(ブラウザ)に応答を送信するときにのみ設定されています。 User.Identity.IsAuthenticatedは、Cookieが設定されているかどうかを確認しています。しかし、クッキーを設定した場所と同じリクエスト内にクッキーが設定されているかどうかを確認しようとしています。

つまり、PasswordSignInAsyncに電話した後で、次の要求でのみユーザーが認証されているかどうかを確認できます。だからそれを取り除くthrow new Exception...とあなたは大丈夫でしょう。

+0

洞察力@trailmaxのおかげで、上記のコードの正確なコピーは、標準の 'Controller'でうまく動作します。これらの2つのタイプのコントローラにおける 'User'(' IPrincipal')オブジェクトの動作上の違いを知りましたか? –

+0

それはMVCで動作するのは奇妙ですが、(私にとっては決してしなかった)ものではありません。 MVC5のAPIコントローラはMVCコントローラとはかなり異なるので、APIであるときにOWINミドルウェアで異なる動作があると思われます。正直言って、私はOWIN-APIの相互運用性を検討していません。 – trailmax

+0

ちょっと@trailmax、多くのありがとう。私はあなたのコメントを読んだ後好奇心を得、私のMVCコントローラをもう一度見て、私が認証チェックを行っていた別のコントローラアクションにユーザーをリダイレクトしていることに気づいた。リダイレクトを行っているときにCookieが設定されているようです。私を助けてくれてありがとう! :) –

関連する問題