2017-07-27 15 views
0

デフォルトのASP.Net MVC 5アプリケーションを設定したので、以下のスニペットがSignInManagerを呼び出す理由を理解できません。コントローラに[Authorize]属性がある場合、このSignInManagerコールの目的は何ですか?

[承認]属性を持つManageControllerにあります。私は、認証されたユーザーを検索whenverユーザーがnullで、そうでない場合ならば、私はチェックすなわち、このステップを繰り返す必要があり、場合、私は疑問に思って

// 
    // POST: /Manage/RemoveLogin 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> RemoveLogin(string loginProvider, string providerKey) 
    { 
     ManageMessageId? message; 
     var result = await UserManager.Get().RemoveLoginAsync(User.Identity.GetUserId<int>(), new UserLoginInfo(loginProvider, providerKey)); 
     if (result.Succeeded) 
     { 
      var user = await UserManager.Get().FindByIdAsync(User.Identity.GetUserId<int>()); 
      if (user != null) 
      { 
       await SignInManager.Get().SignInAsync(user, isPersistent: false, rememberBrowser: false); 
      } 
      message = ManageMessageId.RemoveLoginSuccess; 
     } 
     else 
     { 
      message = ManageMessageId.Error; 
     } 
     return RedirectToAction("ManageLogins", new { Message = message }); 
    } 

は、SignInAsyncを待っています。 編集:ユーザーがnullであるかどうかを確認し、それがあるあれば、今すぐSignInAsync

を待って、私は私が[承認]属性を与えてくれたことを、新しいコントローラを作成し、インデックス()関数できましたコントローラの、私は:

 var user = await UserManager.FindByIdAsync(User.Identity.GetUserId<int>()); 

を私は2つのタブでそのページをロードする場合、それらのいずれかにサインアウトしてからページを更新し、私はログイン画面にリダイレクトされています。私はデバッガを付けて、SignInManagerがヒットしたケースを引き起こすことができませんでした。

どのような場合、ユーザーはnullではないでしょうか?

+1

私は[IUserLoginStore](https://github.com/aspnet/Identity/blob/dev/src/Microsoft.Extensions.Identity.Core/IUserLoginStore.cs)を完全に公平に理解していません。スニペットは、リクエストのユーザのログインを削除します。リクエストのユーザは、そのユーザが現在使用しているログインになります。 'SignInManager'を呼び出すと、影響を受けたユーザーは認証された状態(サインインされた状態)のままになります。最後のログインを削除すると、事実上ログオフされます。その場合、サインイン(認証)されますが、おそらく承認されなくなります。 – ckerth

答えて

0

これは全く異なるものです。 Authorize属性は、ユーザーが認証され、(役割のアクセス許可などに基づいて)操作にアクセスする権限があることを確認します。ユーザーを認証しません。それはSignInManagerへの呼び出しのためのものです。実際にはユーザーを認証するので、ユーザーはAuthorize属性で行われたチェックに合格することができます。

ユーザーがnullの場合、効果的に、アクションがAuthorizeによって保護されている場合は、おそらくこれはありません。ユーザーがデータベースにログインしてサインインするためにユーザーが見つかったイベントのいくつかの奇妙なコンフルエントを取る必要がありますが、それを取得しようとするまでに何とか削除されました。換言すれば、血まみれの可能性はない。それでも、値がnullの可能性がある場合は常にこのようなヌルチェックを実行することをお勧めします。userが可能です。

+0

興味深いことに、私はこの質問を提起したので、if文がuser!= nullをチェックするのは注目すべき点です.....それはタイプミスですか、それとも何か不足していますか? – Diana

+0

@Dianaにはタイプミスがありません。ヌルチェックについてはとても混乱していますか? – trailmax

+0

@Dianaまあ 'UserManager'はユーザーを含む[IUserStore](https://github.com/aspnet/Identity/blob/dev/src/Microsoft.Extensions.Identity.Core/IUserStore.cs)を使います。 'ClaimsPrincipal'には" n "[Identities](https://msdn.microsoft.com/en-us/library/system.security.claims.claimsprincipal.identities(v = vs.110).aspx)が含まれています。 a * UserId *は、ストアのユーザーを参照しません。 したがって 'FindByIdAsync'によって' null'が返されます。両サイドは別々に設定でき、スニペットはいくつかのシナリオを処理しようとします。 – ckerth

関連する問題