はじめに

アイライトのサイトを書き換えようとした時に最初に悩んだ問題でした。
旧アイライトでは、メールアドレスとパスワードにてログインを行っていたのですが、MVCのデフォルトプロジェクトは、名前とパスワードの組み合わせでログインを行うような仕様でした。

何とかしないといけませんね。

そんなに工数を掛けて作る気もなかったので、メンバーシップの機能を調べてみることにしました。
あるものは何でも利用しないといけませんからね(笑)

まぁ、結果として上手くいったので記事にしてみました。

Viewの修正

まず、見た目を直していきましょう。
「Views\Account」にある、「LogOn.aspx」を開きましょう。
ログオンに関係する、デザインがあります。ここにあるユーザー名というものをメールアドレスと書き換えてみてください。
これで、実行すると見た目が変わりました。

と言う事で、もう後には引き返せない。 何としてもメールアドレスでログオン出来るように改造をしなくてはならなくなりました(笑)

ついでに、プログラム中の「UserName」も「Email」と変更しちゃいましょう。
<div class="editor-label">
    <%: Html.LabelFor(m => m.Email) %>
</div>
<div class="editor-field">
    <%: Html.TextBoxFor(m => m.Email)%>
    <%: Html.ValidationMessageFor(m => m.Email)%>
</div>

こんな感じですね。

Modelの修正

次に、データのやり取りを行うModelを修正します。

先ほど、Viewで「UserName」を「Email」と変更したので、その修正を行います。
「Models」のディレクトリにある「AccountModels.cs」を開いてください。
そこにある、LogOnModelクラスに移動してください。 ここを変更する必要があります。

変更前

[Required]
[DisplayName("ユーザー名")]
public string UserName { get; set; }

変更後

[Required]
[DataType(DataType.EmailAddress)]
[DisplayName("電子メール アドレス")]
public string Email { get; set; }

今回、一番重要な修正(笑)


さてさて、次にコントローラーを直しに行ければいいのですが、ちょっと記事を書きやすくするためにそのまま、Modelにあるプログラムを修正してしまいます。

今回の修正の一番肝になる修正へと進みます。
まず、現在の提供されている昨日は、ユーザー名とパスワードでのログオンです。この部分に手を入れるにはちょっと難しい印象を受けました。
と言う事で、このユーザー名とパスワードでログオンするという機能はそのまま残しておいて、その前段にメールアドレスでユーザー名を取り出して、そのユーザー名にてログインを行うように修正を行います。

しかも、直接データベースを見に行かなくてもね。

先ほどの、「AccountModels.cs」の下の方を見に行ってください。「MembershipProvider」をラップしてあるクラスを見つけられると思います。
この部分を修正することにより、コントローラー側で簡単に修正が行えるようにします。

ではでは、メールアドレスから名前を取得するプログラムを実装しましょう


IMembershipServiceを拡張します!!
「AccountModels.cs」の下の方を調べてね。
「IMembershipService」に「string GetUserNameByEmail(string email);」を追加します。

こんな感じになるはず。
public interface IMembershipService
{
    int MinPasswordLength { get; }

    string GetUserNameByEmail(string email);
    bool ValidateUser(string userName, string password);
    MembershipCreateStatus CreateUser(string userName, string password, string email);
    bool ChangePassword(string userName, string oldPassword, string newPassword);
}

「AccountMembershipService」に「GetUserNameByEmail」を追加しましょう。
public class AccountMembershipService : IMembershipService
{
    //省略
    public string GetUserNameByEmail(string email)
    {
        if (String.IsNullOrEmpty(email)) throw new ArgumentException("値を null または空にすることはできません。", "email");

        return _provider.GetUserNameByEmail(email);
    }
    //省略
}

これで、メールアドレスからユーザー情報を取得できるようになりました。
あと少しです。 頑張れ!!


Controllerの修正

さて、次はコントローラの修正になります。
「Controllers」のディレクトリにある、「AccountController.cs」を開いてください。

ログオンがPostされたときに動作する部分を修正します。


変更前

[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        if (MembershipService.ValidateUser(model.UserName, model.Password))
        {
            FormsService.SignIn(model.UserName, model.RememberMe);
            if (!String.IsNullOrEmpty(returnUrl))
            {
                return Redirect(returnUrl);
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }
        else
        {
            ModelState.AddModelError("", "指定されたユーザー名またはパスワードが正しくありません。");
        }
    }

    // ここで問題が発生した場合はフォームを再表示します
    return View(model);
}

変更後

[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        var userName = MembershipService.GetUserNameByEmail(model.Email);

        if (userName != null && MembershipService.ValidateUser(userName, model.Password))
        {
            FormsService.SignIn(userName, model.RememberMe);
            if (!String.IsNullOrEmpty(returnUrl))
            {
                return Redirect(returnUrl);
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }
        else
        {
            ModelState.AddModelError("", "指定されたユーザー名またはパスワードが正しくありません。");
        }
    }

    // ここで問題が発生した場合はフォームを再表示します
    return View(model);
}

比較すると、どんなふうに変更されたかわかりますよね。
実質一行の修正だけで完了しました。(^^v

おわりに

色々なファイルにまたがって修正を行わないといけませんが、内容としてはとても簡単な変更で動くようになったかと思います。

これで、無事にメールアドレスでログオンが出来るようになりましたが、、、 ユーザーにはもっと情報を持たせたいと思います。
プロファイルや、ロールなんて面白い機能がありますので、それはまた次回のお楽しみと言う事で!!


調査環境

VS2010 + MVC2
ASP.NET
C#

更新日

2011/05/22:アップ