web-dev-qa-db-ja.com

SignInManager、それは何で、どのように、いつ使用するのですか?

SignInManagerクラスを調査しています。しかし、MSDNで提供される情報は非常に役に立ちません。提供されるメソッドとプロパティが何であるかのみを示します。

私が探しているのは

1)SignInManagerとは何ですか? 2)使用方法3)そして、資格情報に関連する情報(ユーザー名とパスワード)を含む独自のデータベースを持っています

ユーザー認証にカスタムデータベースが使用されるようにSignInmanagerを使用するにはどうすればよいですか?

私はasp.net MVC 5とVisual Studio 2015を使用しています。サンプルプロジェクトには、次のようなアクションメソッドを含むアカウントコントローラーがあります。

  public async Task<ActionResult> ExternalLoginCallback(string returnUrl)

しかし、私はそれを使用する方法がわかりません、MSDNはこれに関する情報を提供するために完全に役に立たないです。 SignInManagerが何であり、何のためにあるのかわからないので、詳細に説明する役立つリンク。

ありがとう

42
Alex

免責事項:ASP.NET IDで使用されているモデルに戸惑っていますが、不正確である可能性があることを理解していると言います(明らかなことを述べているかもしれませんので、おaび申し上げます)。また、最近Asp.Net CoreのIDで遊んでいましたが、これはAsp.Net 4で利用できるものとは少し異なります。

クッキー

ASP.NET IDは、アプリケーションCookieと外部Cookieの2種類のCookieで動作します。アプリケーションCookieにはアプリケーションのIDが含まれ、サインインマネージャーによって発行されます。外部Cookieには外部認証プロバイダーIDが含まれ、認証ミドルウェア(たとえば、FacebookAuthenticationMiddlewareなど)によって発行されます。サインインマネージャーを使用して、外部Cookieを消費し、代わりにアプリケーションCookieを発行します。外部認証を使用しない場合、外部Cookieを処理しません。

サインインマネージャー

次のように宣言されたクラス:

public class SignInManager<TUser, TKey> : IDisposable 
    where TUser : class, IUser<TKey> 
    where TKey : IEquatable<TKey>

したがって、IUser<TKey>インターフェイスを実装している限り、ユーザーとして任意のクラスを使用できます。または、IUser<string>を実装するゼロから始める場合は、IdentityUserをベースとして使用します。過去にintTKeyとして使用する実装を作成しようとしましたが、動作させるためにかなりの時間を費やし、進捗が見られなかったため、試みを放棄しました。

パスワードサインイン

SignInManager.SignInAsyncメソッドは、チェックなしで指定されたユーザーのアプリケーションCookieをすぐに発行するため、カスタム認証ロジックを実装する場合は、それを使用することができます(デフォルトのasp.net MVCテンプレートは、ユーザー登録後に使用します。登録直後に認証する必要があります)。

SignInManager.PasswordSignInAsync指定されたユーザー名とパスワードは有効性をチェックし、正しい場合はアプリケーションCookieを発行します。

外部サインイン

ユーザーにサイトのログインとパスワードを特別に作成させる代わりに、外部のWebサイトを使用して、OAuthで認証情報を認証して渡すようにしたい場合があります。

Asp.Net IdentityにはUserLoginの概念があります。ここで、Userは...(ユーザー(人)、Loginは資格情報です) Userで認証します。 Userには複数のLoginsがある場合があります。

Asp.Net Webサイトから見たOAuthフローは次のようになります(VSテンプレートによって生成されたデフォルトのログインフローに基づきます)。

  1. 受け入れる意思のある外部認証プロバイダー(認証ミドルウェア)をセットアップします(外部Webサイトへの登録が必要になる可能性があります。たとえば、Facebook認証を使用するには、Facebookアプリを作成する必要があります。 Webサイトを作成し、Facebookが提供するアプリIDとアプリシークレットでFacebookAuthenticationMiddlewareを構成します。
  2. 非認証ユーザーに、サポートする外部プロバイダーの選択肢を提示します。
  3. ユーザーがプロバイダーを選択すると、選択がAsp.Net Webアプリケーションに送信されます
  4. Webアプリケーションは、使用するプロバイダーの名前を含むChallengeResultを発行し(これは通常AccountController.ExternalLoginで発生します)、戻りURLはAccountController.ExternalLoginCallbackを呼び出すように設定され、実際の戻りURLユーザーは終了するはずですinは後で使用するために保存されます。
  5. 適切なミドルウェアはChallengeResultオブジェクトをキャッチし、それをHTTPリダイレクト応答に変換します。これにより、ユーザーのブラウザーは、ユーザーに資格情報を要求するサードパーティのWebサイトに移動します。
  6. 認証が成功すると、サードパーティのWebサイトはユーザーをWebサイトにリダイレクトし、認証ミドルウェアによって作成された特定のURLにリダイレクトします(Facebookの場合は/signin-facebook IIRC)。
  7. 認証ミドルウェアはこの呼び出しをインターセプトし、サードパーティのWebサイトから渡されたデータを検証し、すべてが問題ない場合外部Cookieを発行する、ステップ4で戻りURLとして設定されたもの(AccountController.ExternalLoginCallback)。
  8. AccountController.ExternalLoginCallbackでは、外部Cookieを消費し、代わりにアプリケーションCookieを発行することが期待されています。それがSignInManager.ExternalSignInAsyncが行うことです。ログイン情報が与えられると、Loginを持つユーザーを見つけようとします。見つかった場合、アプリケーションCookieを発行します。そうでない場合は通知され、未知のLoginを受け取ったときに正しいと思うことを行う必要があります(通常、この時点で新しいユーザーを作成します。VSテンプレートからのデフォルト実装はこの時点で追加情報を要求しますAccountController.ExternalLoginConfirmation)にユーザーを作成します。そのユーザーは、手順4で「後で保存する」実際のリターンURLにリダイレクトされます。

カスタムストレージ

これまで、Asp.Net Identityのカスタムストレージの作成に失敗しました。一般に、UserManager<TUser, TKey>を継承する独自のユーザーマネージャークラスの実装と、IUserStore<TUser, TKey>IUserRoleStore<TUser, TKey>などの一連のインターフェイスを実装するストレージクラスの実装が含まれます。

63
n0rd