日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。Identityカスタマイズに挑戦ASP.NETASP.NETの新しい認証に興味津々だったので、ちょっと遊んでみました。Frameworkを使用したものやGoogleやMSアカウントなどを使ったものは無視して、自前で用意した認証情報でログインできるところまでやってみました。空のASP.NETアプリケーションを作成して、以下の参照をNuGetから追加します。Microsoft.Owin.Host.SystemWebOwinをIISで有効にするために必要みたい。(これが無くてOwinのStartupが動かない...!ってはまった)Microsoft.AspNet.Identity.Owin認証に必要なライブラリをごそっとひっぱってくるために追加。空で認証もなんもなしの状態のASP.NETアプリケーションで作ったので、認証に必要な初期化コードを追加します。名前はなんでもいいのですが、Startupという名前にしておきました。そこに、IAppBuilderのUseCookieAuthenticationメソッド(正確にはOwin.CookieAuthenticationExtensionsクラスに定義されている拡張メソッド)を使って認証の設定をします。}}ここでは、認証されてない状態で認証が必要なページに飛んできたら/Auth/Loginに飛ぶようにしました。認証したユーザーの情報を保持するためのクラスを用意します。ユーザーを表すクラスを作るには、Microsoft.AspNet.Identity.IUserインターフェースを実装したクラスを作成します。こいつは、IdとUserNameを持つだけのシンプルなインターフェースなのでさくっと実装しましょう。このクラスにプロパティを追加することで、色々保持させる情報を追加できそうな気もしますが、今回はシンプルにIdとUserNameだけを実装します。Auth.csというファイルをプロジェクトの直下に作って、そこに以下のようなクラスを作成します。次に、ユーザーの情報の管理やパスワードの管理をするクラスを作成します。IUserというインターフェースを実装します。IUserというインターフェースを実装します。型引数には、先ほどIUserを実装したAppUserクラスを指定します。Auth.csにAppUserStoreという名前のクラスで、2つのインターフェースを実装したクラスを作ります。}}基本的にCRUDの処理なので悩むことはないと思います。今回は簡単にするためにパスワードをAppUserクラスのUserNameと同じものだとOKとなるようにしています。そのときに、ちょっと悩んだのがパスワードを取得するためのGetPasswordHashAsyncメソッドで返す値です。このIUserPasswordStoreインターフェースは、ハッシュ化されたパスワードを前提としているようで、ハッシュ化されたパスワードを返す必要があります。普通は、SetPasswordHashAsyncでユーザーを作る時に、ハッシュ化されたパスワードが渡されてくるので、ユーザーとパスワードの紐づけを行っておけば、それをそのまま返すだけでいいのですが、今回は手抜きのためにUserNameをハッシュ化した値を返さないといけませんでした。Identifyのクラスの中にはIPasswordHasherというインターフェースがいて、ハッシュ化の方法をカスタマイズできるようになっています。デフォルトの実装としてPasswordHasherというクラスがいるので、こいつを使ってUserNameをハッシュ化して返しました。MVCの追加HomeControllerを追加します。Controllersフォルダをプロジェクトの下に作ってHomeControllerを作成します。MVC用のクラス達がガシガシと追加されて若干穢された気持ちになりますが、気にしないで行きます。Indexアクションに対応するViewも追加して、Index.cshtmlの中身を以下のようにします。@(User.Identity.Name).そして、この手順で作成したApp_StartのRouteConfigにはデフォルトのコントローラが設定されてないので、HomeControllerをデフォルトに設定するようにコードを変えます。routes.MapRouteのdefaultsにcontrollerを追加します。}}この状態で実行して、以下のようにユーザー名が出ない状態のページが表示されることを確認します。次に、基本全ページに認証がいるようにしようと思うのでFilterConfig.csにAuthorizeAttributeを追加します。}}この状態で実行して、Auth/Loginへリダイレクトされることを確認します。ReturnUrlというパラメータで、戻るべきページがわたってきてることも確認できます。認証用コントローラの作成ついに認証処理です。AuthControllerを作成してLoginというアクションを追加します。returnUrlをパラメータから受け取りViewBagにつめてページにわたすのと、LoginViewModelというユーザー名とパスワードを保持するクラスをViewに渡します。あと、このコントローラは認証いらないので、AllowAnonymous属性を追加しておきます。}}LoginViewModelクラスをmodelにした空のViewを作成して、以下のようにログイン用のフォームを作ります。/>}UserManager<T>クラスを使って認証処理を行います。型引数にはIUserの実装クラス(今回の場合はAppUserクラス)を渡して、コンストラクタの引数には、IUserStore<T>の実装クラス(今回の場合はAppUserStoreクラス)を渡すことでインスタンス化できます。こいつのFindAsyncメソッドにユーザ名とパスワードを渡すことで、対象のユーザーが取得できます。nullの場合はログインに失敗したときの処理をすればOKです。ユーザー情報がとれたら、認証情報をクッキーに保持するための処理をします。UserManagerクラスのCreateIdentityAsyncでクレームベースのIDが作れるみたいです(よくわかってない)。あとは、HttpContextからOwinContextを取得して、そこからAuthenticationプロパティを使ってIAuthenticationManagerのインスタンスを取得します。こいつのSignInメソッドに先ほど作成したクレームベースのIDを渡してやることで、無事認証情報された状態になります。あとは、ReturnUrlで渡されてきたページへリダイレクトすればOKです。Redirect(returnUrl);}動作確認アプリケーションを起動すると、Home/Indexを表示しようと試みますが、Auth/Loginページへリダイレクトされてログインページが表示されます。ユーザー名にuser1、パスワードにuser1と入力してログインを押すとHome/Indexへリダイレクトされて以下のようにユーザー名が表示されます。ユーザー名やパスワードを間違えるともちろんログインできません。情報があんまりなかったので手探りでしたが、結局はIUserインターフェースとIUserStoreインターフェースとIUserPasswordStoreインターフェースを実装するだけで、どうやってユーザーを認証するかという方法をカスタマイズできることがわかりました。MembershipProviderみたいにカオスな感じじゃなくて、実装するのもさほど苦じゃないので、とっととこっちを使うように世の中がなればいいなと思いました。ロールとか、そっち方面も調べないとな...。プロジェクトのダウンロードこのプロジェクトファイルは以下からダウンロードできます。アップデートして色々変わってる...噂には聞いてたんですが、ダウンロードしてびっくりしました。上でも動くみたいです。...2016-07-29CordovaでProxyを突破しようまず、Node.jsのProxy設定が必要になります。WebApp)でMicrosoft.Office365.OutlookS...超苦労したのでメモっておきます。C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。Blogの内容は個人の見解であり、所属する企業を代表するものではありません。)はてなブログをはじめよう!okazukiさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。