Sitecoreの開発者向けトレーニングでは、Sitecoreで管理されているサイトにフォームを作成する方法を学習しますが、ライブサイト用にユーザー登録フォームを作成するような演習はないので、今回はユーザー登録フォームを作成してみようと思います。
Sitecoreは標準で ASP.NETのセキュリティープロバイダー(メンバシップやロール、プロファイルプロバイダーなど)をそのままもしくは拡張して使用するユーザー管理の仕組みをはじめから提供しています。そのため、今回は標準で使用できるセキュリティープロバイダーを使用して、ユーザーをSitecoreが管理するユーザー管理データベースに登録する方法でユーザー登録フォームを作成してみます。
今回使用した環境は Sitecore 9.1 Initial Release です。また、細かな手順を記載すると大変なので、SXSD(Sitecore エクスペリエンスソリューションデベロッパー) コースで習得する開発知識を有している前提で説明を記載します。
1. 使用するクラスについて
冒頭で記載した通り、SitecoreはASP.NETが提供するセキュリティープロバイダーをそのまま使用もしくは拡張してメンバシップやロール、プロフィール管理をしています。そのため、ASP.NETのMembershipクラスなどをそのまま使用してユーザーを作成したり、ロールのメンバーにしたり、プロフィールを変更できます。
Membershpクラスを使用したユーザー登録例は https://doc.sitecore.com/archive/ ページのSecurity API Cookbook を参考にできます。
今回は、ASP.NETのメンバシップなどのセキュリティープロバイダーをラップしたクラスが Sitecore.Security 名前空間に定義されているので、せっかくなのでそちらのクラスを使用することにします。
2. コントローラーの作成
RegistrationControllerという名前で今回はコントローラーレンダリングを作成します。まず、ユーザー登録用にモデルクラスをUserModel という名前で作成します。
public class UserModel { [Required] public string UserName { get; set; } = string.Empty; [Required] public string Password { get; set; } = string.Empty; }
次に、コントローラのアクションメソッドを実装します。今回はバリデーションやページに複数フォームが存在していた場合の対処などの本質ではない処理はソースに含めていないので注意してください。
public class RegistrationController : Controller { // GET: Registration public ActionResult Index() { return View(); } [ValidateAntiForgeryToken] [HttpPost] public ActionResult Index(UserModel model) { if (Sitecore.Security.Accounts.User.Current.IsAuthenticated) { // Logout Sitecore.Security.Authentication.AuthenticationManager.Logout(); } if (!ModelState.IsValid) { return View(); } if (CreateUser(model)) { return View("Success"); } return View(); } private bool CreateUser(UserModel model) { string fullName = null; if (!model.UserName.Contains("\\")) { fullName = Sitecore.Context.Site.Domain + "\\" + model.UserName; } else { fullName = model.UserName; } var user = Sitecore.Security.Accounts.User.Create(fullName, model.Password); // メンバシッププロバイダーを直接使う方法でも作成できます。 // Membership.CreateUser(fullName, model.Password); // プロフィールを更新例 //user.Profile.Email = "test@test.jp"; //user.Profile.Save(); // ログイン(認証クッキーをセット) Sitecore.Security.Authentication.AuthenticationManager.Login(user); // ユーザー名とパスワードでログインすることもできます。 // Sitecore.Security.Authentication.AuthenticationManager.Login(fullName, model.Password); return user != null; } }
ソースコードは重要な部分にはコメントを追加しているのでほとんど自明だと思いますが簡単に説明します。Post用のメソッドで、ログイン済みの場合は、 AuthenticationManager.Logout() を呼び出してログアウトしています。ログアウトの処理を実装する場合は、このメソッドを呼び出すようにします。
続いて呼び出される CreateUser メソッドでフォームに入力されたアカウントとパスワードを使用してユーザーを作成する処理を実装しています。ユーザーはドメインで管理されるので、ドメインが指定されていない場合は、Sitecore.Context.Site.Domain を使用してライブサイトのデフォルトのドメインを使用するようにしています。あとは、Sitecore.Security.Accounts.User.Create を使用してユーザーを作成しています。コメントで記載していますが、Membership クラスを使用することも可能です。また、Profileプロパティを使用してメールアドレスなどのプロフィールを変更する例もコメントで記載しています。
ユーザーを作成したら、そのユーザーでログインしています。ログインにはSitecore.Security.Authentication.AuthenticationManager.Login を使用します。 ログイン処理を実装する場合は、このメソッドを呼び出すようにするだけです。
これら、Sitecore.Security名前空間で定義されているUserやAuthenticationManagerクラスは基本的には ASP.NET メンバシッププロバイダーや、フォーム認証で使用するFormAuthentication クラスなどをラップしたものになりますが、将来の仕様変更などに対応しやすくするように、Sitecoreで用意されているクラスを使用しました。
あとは、フォームを表示する。 Index.cshtml と 登録が成功したときに表示する Success.cshtml を例えば次のように用意します。
Index.cshtml の例
@using SCSample.Models; @model SCSample.Models.UserModel @if (Sitecore.Context.PageMode.IsExperienceEditor) { <div>編集モード(エクスペリエンスエディターモード):ここに登録フォームが表示されます</div> } else { using (Html.BeginForm()) { @Html.AntiForgeryToken() @Html.LabelFor(x => x.UserName) @Html.TextBoxFor(x => x.UserName) <br /> @Html.LabelFor(x => x.Password) @Html.PasswordFor(x => x.Password) <br /> <input type="submit" value="Register" /> } }
Success.cshtmlの例
<h1>作成に成功しました</h1> <div>User: @Sitecore.Security.Accounts.User.Current.Name</div>
あとは、Sitecore上にコントローラーレンダリングとして登録して、任意のページに配置して動作確認してください。登録の手順などは省略します。
3. 動作確認
コントローラーレンダリングを設置したページにアクセスします。編集(エクスペリエンスエディター) モードの場合は、フォームを表示しないようにしたので、プレビューモードに変更して下記のようなフォームが表示されることを確認します。
フォームを入力して、 Register ボタンをクリックすると画面がリフレッシュして例えば次のような成功画面が表示されます。
Sitecoreの編集環境にログインして、ユーザー管理ツールで、作成したユーザーが登録されていることを確認できれば成功です。
簡単ですが説明は以上です。
今回はユーザー登録で使用するクラス以外にログインやログアウトするためのメソッドやクラスなどもついでに紹介しました。
さんのコメント: さんのコメント: