web-dev-qa-db-ja.com

ASP.NET MVC Web APIでロールを作成し、ロールにユーザーを追加する方法

個人のアカウントを使用する.NET Web APIプロジェクトがあります。標準テンプレートAccountControllerを使用してユーザーを細かく登録できます。ただし、ユーザーの種類に応じて、役割を設定してユーザーを役割に追加したいと思います。

DBに自動的に設定されるロールはありません。役割を設定する方法と、ユーザーを役割に追加する方法を教えてください。

これに関して見つけることができる唯一の情報は、古いASP.NETメンバーシップに基づいているため、ストアドプロシージャが設定されていないという事実に失敗しています。

MSDNのフォーラムやチュートリアルを精査していて、Web APIの例を見つけられないようです。

18
Ben Drury

RoleManagerを使用してロールを追加できます...

using (var context = new ApplicationDbContext())
{
    var roleStore = new RoleStore<IdentityRole>(context);
    var roleManager = new RoleManager<IdentityRole>(roleStore);

    await roleManager.CreateAsync(new IdentityRole { Name = "Administrator" });

    var userStore = new UserStore<ApplicationUser>(context);
    var userManager = new UserManager<ApplicationUser>(userStore);

    var user = new ApplicationUser { UserName = "admin" };
    await userManager.CreateAsync(user);
    await userManager.AddToRoleAsync(user.Id, "Administrator");
}

現在、ドキュメントは少し軽量です。しかし、RoleManagerとUserManagerを少し操作すると、APIはかなり見つけやすくなります(ただし、常に直感的であるとは限らず、ストアまたはdbコンテキストに対して直接クエリを実行する必要がある場合もあります)。

23
Anthony Chu

理解するのに少し時間がかかりましたが、ようやく手に入りました。アンソニー、失礼しますが、私のような愚かな開発者が理解できるように、たくさんのコードを再投稿します。

最新のWebAPI2(Visual Studio 2013 Update 2)では、登録方法は次のようになります。

// POST api/Account/Register
[AllowAnonymous]
[Route("Register")]
public async Task<IHttpActionResult> Register(RegisterBindingModel model)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    var user = new ApplicationUser() { UserName = model.Email, Email = model.Email };

    IdentityResult result = await UserManager.CreateAsync(user, model.Password);


    if (!result.Succeeded)
    {
        return GetErrorResult(result);
    }

    return Ok();
}

あなたがしたいことはこれをこれで置き換えることです:

// POST api/Account/Register
[AllowAnonymous]
[Route("Register")]
public async Task<IHttpActionResult> Register(RegisterBindingModel model)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }


    IdentityResult result;
    using (var context = new ApplicationDbContext())
    {
        var roleStore = new RoleStore<IdentityRole>(context);
        var roleManager = new RoleManager<IdentityRole>(roleStore);

        await roleManager.CreateAsync(new IdentityRole() { Name = "Admin" });

        var userStore = new UserStore<ApplicationUser>(context);
        var userManager = new UserManager<ApplicationUser>(userStore);

        var user = new ApplicationUser() { UserName = model.Email, Email = model.Email };

        result = await UserManager.CreateAsync(user, model.Password);
        await userManager.AddToRoleAsync(user.Id, "Admin");

    }

    if (!result.Succeeded)
    {
        return GetErrorResult(result);
    }

    return Ok();
}

投稿すると正しく動作するはずですが、さらに問題が発生する可能性があります。これを行った後、私の応答はDBについて不平を言いました。

The model backing the <Database> context has changed since the database was created

このエラーを修正するには、パッケージマネージャーコンソールに移動して、移行を有効にする必要がありました。

Enable-Migrations –EnableAutomaticMigrations

次に:

Add Migration

最後に:

Update-Database

ここに移行を有効にする良い記事: http://msdn.Microsoft.com/en-us/data/jj554735.aspx

6
allencoded