[翻訳]ASP.NET MVC 3が開発した20の秘訣(一)[20 Recipes for Programming MVC 3]:パスワード検証によるアクセス制限ビュー

11196 ワード

議題
ユーザーが登録し、ユーザー名とパスワードでログインしてアクセスできるWebサイトの特定のページを作成します.
アクセス権制御付きの特定のページを作成します.ユーザーは、ユーザー名とパスワードを使用してログインしてからアクセスする必要があります.
ソリューション
AccountControllerとAccountModels、およびいくつかの検証ビューは、MembershipおよびFormsAuthenticationによってユーザーの作成および検証機能を実現します.ASP.NETではAuthorizeAttributeでアクセス権を制御します.
 
ディスカッション
マイクロソフトのASP.NET MVCチームはAccountControllerに対して多くの改良を行い、FormsAuthenticationクラスを更新し、Membershipオブジェクトによって新しいユーザーを作成し、既存のユーザーに対してCookieを作成し、このオブジェクトによってユーザーの状態を確認した.
 
MVC 2とは異なり、第3版では「新規プロジェクト」のダイアログボックスを更新し、空のアプリケーション、インターネットアプリケーション、イントラネットアプリケーションの3種類の異なるアプリケーションタイプを提供した.空のアプリケーションは、プロジェクトにMVCを作成するために必要なフォルダ構造のみを作成します.Internetアプリケーションは、デフォルトのテンプレートを設定し、基本的なレイアウトテンプレートとAccountControllerによるユーザー登録、ログインを行うMVCを含むいくつかの機能を作成し、事前に構成します.3番目のテンプレートはIntranetアプリケーションで、インターネットアプリケーションとは異なり、Membershipクラスを使用して検証するのではなくWindows認証方式を使用します.
 
ほとんどのサイトでは、デフォルトのインターネットアプリケーションを使用すればいいです.新しいMVC 3のインターネットアプリケーションを作成すると、AccountControl、AccountModels、およびユーザーの登録、ログイン、パスワードの変更に関するビューを含むいくつかのユーザーアカウントに関するビューが生成されます.
 
ユーザが特定のページにアクセスすることを防止するために、MVCは、特定のコントローラおよびアクション上でAuthorizeAttributeによってアクセスを制御する.ActionControllerを開きます.csでは、次の内容が表示されます.
        //

// GET: /Account/ChangePassword



[Authorize]

public ActionResult ChangePassword()

{

return View();

}

登録されていないユーザが/ACcount/ChangePasswordを介してアクセスすると、MVCは自動的にログインページにジャンプします.すでにログインしている場合は、ページはリダイレクトされず、ビューの内容が表示されます.デフォルトでリダイレクトされたユーザー登録アドレスはWeb.Configファイルでの設定:
    <authentication mode="Forms">

<forms loginUrl="~/Account/LogOn" timeout="2880" />

</authentication>

ユーザーが以前に登録したことがない場合は、最後に登録ページに転送されます.デフォルトの登録では、次の情報を収集する必要があります.
lログインユーザ名
l電子メールアドレス
lログインパスワード
AccountControllerのRegisterメソッドは、メンバーシップによって新しいユーザーアカウントを作成します.Registerメソッドの入力パラメータはRegisterModelタイプオブジェクトです.ページの登録フォームについてAccountModelsでRegisterModelというオブジェクトを定義しました. 
[HttpPost]

public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
//
MembershipCreateStatus createStatus;
Membership.CreateUser(model.UserName, model.Password
, model.Email, null, null, true, null, out createStatus);

if (createStatus == MembershipCreateStatus.Success)
{
FormsAuthentication.SetAuthCookie(model.UserName, false );
return RedirectToAction("Index", "Home");
}
else
{
ModelState.AddModelError("", ErrorCodeToString(createStatus));
}
}
}

上で自動的に生成されたコードは、3つの重要な機能を実現しています.
  • ユーザは、データを入力後、Membershipを通過する.CreateUser()メソッドは、新しいユーザーを作成します.
  • ユーザーが作成に成功したことを確認し、FormsAuthenticationを通過します.SetAuthCookieは、ユーザが後でページにアクセスするときに認証するためにユーザログイン状態を設定します.
  • ユーザーが正常に作成された場合、ユーザーはホームページにリダイレクトされます.(ユーザーの作成中にエラーが発生した場合、エラーメッセージはエラービューに渡され、表示エラー情報がユーザーに表示されます). 

  • Visual Studioのフルバージョンがインストールされている場合は、インストールされているSQL Expressからデータベースを作成できます.または、ベーシックバージョンのVisual Studioのみをインストールするか、マイクロソフトのWebサイトから無料のSQL Expressにダウンロードすることもできます.
    App_Dataフォルダに作成されたSQL Expressデータベースは、Web上にあります.configにデフォルトのデータベースリンク文字列を追加します.このSQL Expressデータベースには、Membershipクラスが格納する必要があるユーザーコンテンツの様々なテーブル、例えばユーザー資料、ロールなどが含まれます. 
    <connectionStrings>
    <add name="ApplicationServices"
    connectionString
    ="data source=.\SQLEXPRESS;
    Integrated Security=SSPI;
    AttachDBFilename=|DataDirectory|aspnetdb.mdf;
    User Instance=true"

    providerName
    ="System.Data.SqlClient" />
    </connectionStrings>

    ユーザーが再びウェブサイトにアクセスすると、最後にFromsAuthenticationで設定したCookieは依然として有効です(ログイン時に「私を覚えてください」というオプションが選択されているか、閲覧中のページが閉じていない可能性があります).この場合、表示されたビューは再ログインや登録を要求しません.Cookieが存在せず、ユーザーが登録を完了した場合、ページはログインページにリダイレクトされます.ユーザーがログイン情報を入力して送信すると、AccountControllerは再びMemershipでユーザーログインを検証します.コードは次のとおりです.
            [HttpPost]
    public ActionResult LogOn(LogOnModel model, string returnUrl)
    {
    if (ModelState.IsValid)
    {
    if (Membership.ValidateUser(model.UserName,
    model.Password))
    {
    FormsAuthentication.SetAuthCookie(
    model.UserName, model.RememberMe);
    if (Url.IsLocalUrl(returnUrl)
    && returnUrl.Length > 1
    && returnUrl.StartsWith("/")
    && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
    {
    return Redirect(returnUrl);
    }
    else
    {
    return RedirectToAction("Index", "Home");
    }
    }
    else
    {
    ModelState.AddModelError("", "");
    }
    }

    //
    return View(model);
    }

    上で自動的に生成されたコードは、3つの重要な機能を実現しています.
  • はMemershipを通過する.ValidateUser()メソッドは、ユーザーが入力したユーザー名とパスワードを検証します.
  • ログインが成功すると、FormsAuthenticationを通過します.SetAuthCookieメソッドはログイン情報を設定します.
  • ユーザーが検証に合格した場合、ユーザーはトップページにリダイレクトされます(または検証に合格しなかった場合、ページにエラー情報がユーザーに表示されます).

  • AuthorizeAttributeでは、特定のページへのアクセスを制限するほか、他の制限オプションも提供できます.使用方法は次のとおりです.
            // Retrieve a list of all users to allow an admin
    // to manage them
    [Authorize(Roles = "Admin")]
    public ActionResult UserAdmin()
    {
    MembershipUserCollection users =
    Membership.GetAllUsers();
    return View(users);
    }

    // Create some custom reports for me only
    [Authorize(Users = "Jamie")]
    public ActionResult JamieAdmin()
    {
    // Perform some logic to generate usage reports
    ...
    return View();
    }

    これらの簡単な例は、アクセス制限に関するいくつかの入門内容を紹介しているだけです.次の章では、カスタムグループアクセス制限Controllerを追加する方法を検討します.
    リファレンス情報
    AuthorizeAttributeFormsAuthenticationおよびMembership