新しもの好きプログラマの耳より情報ブログ

仕事でもあるプログラミングについて役に立ちそうな情報を発信していこうというブログです。役に立たなそうな情報はfacebookで。

ASP.NET Identifyでパスワード0文字を許容する方法

ASP.NET Identityのユーザー情報に既存のDBのレコードを使うものを作ってみた。
この方式だと、ロールごとにページのアクセス権を管理したり一定時間でセッションをタイムアウトしたりといった機能をASP.NET Identityがよろしくやってくれるので
独自にユーザー認証を実装するよりも使いやすいものになる。

その方法自体は次のサイトあたりを参考にすれば良いので、このブログでは触れない。それらのサイトの情報に従って実装したらさほど苦労なく実現できた。素晴らしい情報をまとめてくれた先達に感謝。
>ASP_NET Identityカスタマイズに挑戦 - かずきのBlog@hatena
>http://okazuki.hatenablog.com/entry/2013/11/10/190811
>[めも]ASP_NET Identity 2_0_0 カスタマイズ - CAT EARS
>http://www.cat-ears.net/?p=31697


ここではタイトルの通り、パスワード0文字を許可する方法を紹介する。
大したテクニックではないが、意外と手間取ったので。
パスワード0文字なんてものは普通はセキュリティ上許可しないのだろうが、既存仕様の都合で許可せざるを得なかった。

 


さてASP.NET Identityでは、パスワードの入力制限についても
ASP.NET MVC 5でプロジェクトを生成するとUserManager.PasswordValidatorがよろしくやってくれている。
これは楽だ、ということでPasswordValidator.RequiredLength=0と指定したところ・・・
「パスワードは0文字以上入力して下さい」
との間抜けなエラーが表示された。
どうやら0文字を許可できない実装らしい。

そこで、組み込みのPasswordValidatorを次のように派生させたら問題なく実現できた。

public class PasswordValidator_NotRequired : PasswordValidator
{
 public override Task<IdentityResult> ValidateAsync(string item)
 {
  //パスワードが空の場合、他の判定をせずに成功を返す(パスワード無し、もしくは規則に従ったパスワード有りの2択という仕様であるため)
  if (string.IsNullOrEmpty(item))
  {
   return Task.FromResult<IdentityResult>(IdentityResult.Success);
  }

  return base.ValidateAsync(item);
 }
}

地味なテクニックだが、意外と他の解決方法が見つからなかったので紹介してみた。