ASP.NET IdentityでRoleを使う手順

ASP.NET Identity 2.0とは?

ASP.NET Identity 2.0が登場し、Visual Studio 2013の標準テンプレートに組み込まれるようになりました。

ONE ASP.NETMVCでもWebAPIでも使え、OWINでソーシャル連携ログイン、nugetでも簡単にインストールできるようになりました。

が、今までのASP.NETフォーム認証と似ているようで、設定方法など全く別物になりました。

基本的なことは以下のサイトをご覧いただけるとわかると思います。

ASP.NET Identity | どっとねっとふぁん

ASP.NET Identity入門:CodeZine(コードジン)

ただ単にユーザーの登録、ログインするだけなら、標準テンプレートで十分使えると思います。

 

ロールはどこに?

フォーム認証の頃から、ロールベースのアクセス制御ができたのですが、今のテンプレートにはロールに関するコードありません。

いくつかコードを追加するだけで使えるようになるので、まとめておきます。MVC 5でのコードです。

Models/IdentityModels.cs

public class ApplicationRole : IdentityRole
{
}

App_Start/IdentityConfig.cs

public class ApplicationRoleManager : RoleManager<ApplicationRole, string>
{
    public ApplicationRoleManager(IRoleStore<ApplicationRole, string> store)
        : base(store)
    {
    }
     public static ApplicationRoleManager Create(IdentityFactoryOptions<ApplicationRoleManager> options, IOwinContext context)
    {
        var manager = new ApplicationRoleManager(new RoleStore<ApplicationRole>(context.Get<ApplicationDbContext>()));
        return manager;
    }
}

App_Start/Startup.Auth.cs

public partial class Startup
{
    // 認証設定の詳細については、http://go.microsoft.com/fwlink/?LinkId=301864 を参照してください
    public void ConfigureAuth(IAppBuilder app)
    {
        app.CreatePerOwinContext(ApplicationDbContext.Create);
        app.CreatePerOwinContext<ApplicationUserManager≥(ApplicationUserManager.Create);
        
        // このコードを追加
        app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);
    }
}

Controllers/AccountController.cs

public class AccountController : Controller
{
    private ApplicationUserManager _userManager; 
    private ApplicationRoleManager _roleManager;

    public AccountController()
    {
    }

    public AccountController(ApplicationUserManager userManager, ApplicationRoleManager roleManager, ApplicationSignInManager signInManager)
    {
        UserManager = userManager;
        RoleManager = roleManager;
        SignInManager = signInManager;
    }

    public ApplicationRoleManager RoleManager
    {
        get
        {
            return _roleManager ?? HttpContext.GetOwinContext().Get<ApplicationRoleManager>();
        }
        private set
        {
            _roleManager = value;
        }
    }
}

 

これでビルドするとAccountController上でRoleManagerがつかえるようになります。

すでにDBが作成されている場合サーバーエラーが発生します。

データベースの作成後、'ApplicationDbContext' コンテキストの背後にあるモデルが変更されました。Code First Migrations を使用したデータベースの更新を検討してください (http://go.microsoft.com/fwlink/?LinkId=238269)。
  説明: 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所については、スタック トレースを参照してください。 
 この場合データベースの更新が必要です。

パッケージマネージャで以下のコマンドを実行します。

PM> Enable-Migrations
コンテキストが既存のデータベースを対象にしているかをチェックしています...
データベース初期化子で作成されたデータベースが検出されました。既存のデータベースに対応する移行 '201410121217026_InitialCreate' がスキャフォールディングされました。代わりに自動移行を使用するには、Migrations フォルダーを削除し、-EnableAutomaticMigrations パラメーターを指定して Enable-Migrations を再実行します。
Code First Migrations がプロジェクト WebApplicationIdentity で有効になりました。
PM> Add-Migration "AddRole"
移行 'AddRole' をスキャフォールディングしています。
この移行ファイルのデザイン コードには、現在の Code First モデルのスナップショットが含まれています。このスナップショットは次の移行をスキャフォールディングする際、モデルに対する変更の計算に使用されます。モデルに追加の変更を行い、この移行に含める場合は、'Add-Migration AddRole' を再実行して再度スキャフォールディングできます。
PM> Update-Database
ターゲット データベースに適用されている SQL ステートメントを表示するには、'-Verbose' フラグを指定します。
明示的な移行を適用しています: [201410121336408_AddRole]。
明示的な移行を適用しています: 201410121336408_AddRole。
Seed メソッドを実行しています。

すでに別のEntity Frameworkでcontextが作成されている場合は、Enable-Migrations -ContextTypeName [context名]で、Context名を指定できますので、ApplicationDbContextを指定してください。

ロール(RoleManager)を使う

RoleManager.Rolesプロパティでロールの一覧が取得できます。

RoleManager.RoleExistsメソッドで存在確認、Createメソッドで作成ができます。

~Asyncもありますので必要な方を使ってください。

 

ユーザーとロールの関連は、UserManager.AddToRole、AddToRoles、GetRoles、IsInRole、RemoveFromRole、RemoveFromRolesメソッドなどで操作できます。

 

mvcのコントローラーでロールのアクセス制御をする場合は、依然と同様で、

[Authorize(Roles = "ロール名")]

で使用できます。

 

ASP.NET関連本

 

独習ASP.NET 第4版

独習ASP.NET 第4版

 

 

 

プログラミング MICROSOFT ASP.NET4 (Microsoft Press)

プログラミング MICROSOFT ASP.NET4 (Microsoft Press)