フォーム認証によるロールベースのアクセス制御

アクセス制御の仕方

  • アクションクラスまたはアクションメソッドにアノテーションで設定する。
    public class HomeController : Controller
    {
        [Authorize(Roles="Administrations")]
        public ActionResult Index() {}
    }

認証を行うクラス

  • MembershipProviderを継承したカスタムクラスでユーザ認証を行う
  • RoleProviderを継承したカスタムクラスでロールの管理を行う

認証ユーザの参照

 public ActionResult Index() {
    var user = HttpContext.User;
 }

実装例

MembershipProvider

public class MyCustomMembershipProvider : MembershipProvider
{
    public override bool ValidateUser(string username, string password)
    {
        if (username == "admin" && password == "123456") {
            return true;
        }
        if (username == "user" && password == "123456") {
            return true;
        }
        return false;
    }

これ以外のMembershipProviderの抽象メソッドは取り敢えず未実装で良い。

RoleProvider

public class MyCustomRoleProvider : RoleProvider
{
    public override bool IsUserInRole(string username, string roleName)
    {
        if (username == "admin" && roleName == "Administrators") {
            return true;
        }
        else if (username != "admin" && roleName == "Users") {
            return true;
        }
        return false;
    }

    public override string[] GetRolesForUser(string username)
    {
        if (username == "admin") {
            return new string[] { "Administrators" };
        }
        else {
            return new string[] { "Users" };
        }
    }

これ以外のRoleProviderの抽象メソッドは取り敢えず未実装で良い。

web.config

<system.web>
  <authentication mode="Forms" >
    <forms loginUrl="~/Login/Index"></forms>
  </authentication>
  <membership defaultProvider="myCustomMembershipProvider">
    <providers>
      <clear />
      <add name="myCustomMembershipProvider" type="WebApplication1.MyCustomMembershipProvider" />
    </providers>
  </membership>
  <roleManager enabled="true" defaultProvider="myCustomRoleProvider">
    <providers>
      <clear/>
      <add name="myCustomRoleProvider" type="WebApplication1.MyCustomRoleProvider" />
    </providers>
  </roleManager>

Loginコントローラ

public class LoginController : Controller
{
    readonly MyCustomMembershipProvider _membershipProvider = new MyCustomMembershipProvider();

    public ActionResult Index()
    {
        FormsAuthentication.SignOut();
        return View();
    }

    [HttpPost]
    public ActionResult Index(UserEntity user)
    {
        if (_membershipProvider.ValidateUser(user.Username, user.Password)) {
            FormsAuthentication.SetAuthCookie(user.Username, false);
            return RedirectToAction("Index", "Home");
        }

        ViewBag.Message = "Username or Password is incorrect.";
        return View(user);
    }
}

以上でMembershipProviderを使ってユーザ認証を行う。

Loginビュー

@model WebApplication1.UserEntity
@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<div>@ViewBag.Message</div>

@using (Html.BeginForm()) {
    @Html.EditorFor(m => m)
    <input type="submit" value="LOGIN" />
}

Loginビューモデル

public class UserEntity
{
    public string Username { get; set; }
    public string Password { get; set; }
}

アクセス制御をするアクションクラス・メソッド

public class HomeController : Controller
{
    [Authorize]
    public ActionResult Index()
    {
        return View();
    }

    [Authorize(Roles="Administrators")]
    public ActionResult Index2()
    {
        return View();
    }
}

参考

外部認証 app_start\startup.auth.cs

http://weblogs.asp.net/imranbaloch/archive/2013/07/18/configuring-asp-net-mvc-5-login-options.aspx


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

Last-modified: 2014-03-16 (日) 18:17:31 (1891d)