ユーザー情報の変更
次にユーザー情報を変更する方法について説明していきましょう。更新用のUpdateUserメソッドをコードビハインドに定義します(リスト4)。UpdateUserメソッドの引数はモデルバインドを使うため、ApplicationUser型です。
/// <summary>
/// ユーザー情報を更新します。
/// </summary>
/// <param name="user">画面で入力したユーザー情報。</param>
public void UpdateUser(ApplicationUser user)
{
// (1) 更新対象ユーザー情報取得
var target = manager.FindById(user.Id);
// 入力値を反映する
target.Email = user.Email;
target.UserName = target.Email;
// パスワードが入力されていたら、パスワードも設定
var Password = UserGridView.Rows[UserGridView.EditIndex].FindControl("Password") as TextBox;
if (String.IsNullOrEmpty(Password.Text) == false)
{
var password = Password.Text;
// (2) 入力したパスワードの検証
var validateResult = manager.PasswordValidator.ValidateAsync(password)
.GetAwaiter()
.GetResult();
if (validateResult.Succeeded == false)
{
var error = validateResult.Errors.FirstOrDefault();
ErrorMessage.Text = error;
ModelState.AddModelError("error", error);
return;
}
// (3) パスワードはハッシュ化して設定
var passwordHash = manager.PasswordHasher.HashPassword(password);
target.PasswordHash = passwordHash;
}
// (4) ユーザー情報更新
var result = manager.Update(target);
if (result.Succeeded == false)
{
var error = validateResult.Errors.FirstOrDefault();
ErrorMessage.Text = error;
ModelState.AddModelError("error", error);
return;
}
}
(1)更新対象ユーザー情報取得
user引数にはあくまで画面で入力した項目しか値が設定されていないため、そのまま更新処理に渡すことはできません。そこで、user引数のIdプロパティを使い、UserManagerクラスのFindById拡張メソッドで更新対象ユーザー情報を取得します。そして、取得した更新対象ユーザー情報に、入力値を設定します。この時、ユーザー名にも電子メールを設定しておきましょう。
(2)入力したパスワードの検証
Register.aspxで行う新規ユーザー登録時と同様に、パスワードの強度を検証するためUserManagerクラスのPasswordValidatorプロパティが持つ、ValidateAsyncメソッドを呼び出します。この処理はTask<IdentityResult>型を返す非同期メソッドのため、GetAwaiterメソッド、GetResultメソッドを使い同期的に呼び出すようにします。この挙動の詳細は、参考資料1のページを参照してください。
パスワードの検証に失敗すると、戻り値のIdentityResult型のオブジェクトのSucceededプロパティがfalseになるので、そのエラー情報をErrorsプロパティから取得し、画面のエラー用項目に設定します。また、モデルバインドの処理でエラーがあったことを表すため、Page.ModelStateプロパティのAddModelErrorメソッドも呼び出します。
(3)パスワードのハッシュ化
セキュリティ上の観点から、パスワードは入力された値のままでデータベースに登録するのは避けるべきです。ASP.NET Identityでもその点は考慮されています。UserManagerクラスのPasswordHasherプロパティが持つHashPasswordメソッドを使い、入力パスワードをハッシュ化してから設定ししょう。
(4)ユーザー情報更新
変更後の値が設定されたユーザー情報を用いて、UserManagerクラスのUpdate拡張メソッドを呼び出し、ユーザー情報を更新します。
ユーザー情報の削除
最後に、ユーザー情報の削除方法について説明します。削除用DeleteUserメソッドをコードビハインドに追加します(リスト5)。
/// <summary>
/// ユーザー情報を削除します。
/// </summary>
/// <param name="user">画面で選択したユーザー情報。</param>
public void DeleteUser(ApplicationUser user)
{
// 削除対象ユーザー取得
var target = manager.FindById(user.Id);
// 削除する
var result = manager.Delete(target);
if (result.Succeeded == false)
{
var error = result.Errors.FirstOrDefault();
ErrorMessage.Text = error;
ModelState.AddModelError("error", error);
return;
}
}
ユーザー情報を削除するには、UserManagerクラスのDelete拡張メソッドを呼び出します(このメソッドはASP.NET Identity 2.0で追加されました)。
以上で、ユーザー情報を一覧表示し、変更、削除することができるようになりました。なお、Accout¥Register.aspx(.cs)の実装を参考にすれば、登録処理を追加することも簡単にできます。ダウンロードできるサンプルでは実装してありますので、ぜひ参照してみてください。
まとめ
今回はユーザー情報を管理する方法を紹介しました。ポイントは次の通りです。
- ユーザー情報を取得するには、UserManagerクラスのUsersプロパティを使う
-
ユーザー情報を更新するには、UserManagerクラスのUpdateメソッドを使う
- 更新対象ユーザー情報は、一度FindByIdメソッドを使って取得する必要がある
- パスワードの検証はUserManagerクラスのPasswardValidatorプロパティのValidateAsyncメソッドを使う
- パスワードはUserManagerクラスのPasswordHasherプロパティのHashPasswordメソッドを使ってハッシュ化して設定する
- ユーザー情報を削除するには、UserMangerクラスのDeleteメソッドを使う
さて、今回作成したユーザー管理画面ですが、管理者でないユーザーでも使えてしまっては問題があります。そこで、次回は「管理者」等の権限を持ったユーザーのみユーザー管理画面を使えるよう、「ロール機能」を使って利用者を制限してみましょう。お楽しみに。
