Asp.net Identity MVC5でのロールの作成


85

新しいAsp.netIdentity SecurityFrameworkの使用に関するドキュメントはほとんどありません。

新しいロールを作成してユーザーを追加するためにできることをまとめました。私は次のことを試しました:ASP.NETIdentityに役割を追加する

これは、このブログから情報を取得したようです。asp.netIDを使用して単純なTo Doアプリケーションを構築し、ユーザーをToDoに関連付けます。

モデルが変更されるたびに実行されるデータベース初期化子にコードを追加しました。RoleExists次のエラーで関数が失敗します。

System.InvalidOperationException mscorlib.dllで発生しましたエンティティタイプIdentityRoleは、現在のコンテキストのモデルの一部ではありません。

protected override void Seed (MyContext context)
{
    var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context)); 
    var RoleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));

    // Create Admin Role
    string roleName = "Admins";
    IdentityResult roleResult;

    // Check to see if Role Exists, if not create it
    if (!RoleManager.RoleExists(roleName))
    {
        roleResult = RoleManager.Create(new IdentityRole(roleName));
    }
}

どんな助けでも大歓迎です。

回答:


26

MyContextクラスの次の署名があることを確認します

public class MyContext : IdentityDbContext<MyUser>

または

public class MyContext : IdentityDbContext

コードは何も変更せずに機能しています!!!


4
返信ありがとうございます。すべてが機能しています。コンテキストをチェックすることで、私は正しい方向に進みました。asp.net IDが作成されると、IdentityDbContextを拡張する新しいコンテキスト(ApplicationDbContext)が作成されます。私のコードでは、IdentityDbContextを拡張していない元のコンテキストを参照していました。他の誰かがこの問題を抱えている場合は、コンテキストを確認し、APP_DATAディレクトリを再確認して、誤って2つのデータベースを作成していないことを確認してください。
colbyJax 2013年

74

さあ行こう:

var roleManager = new RoleManager<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));


   if(!roleManager.RoleExists("ROLE NAME"))
   {
      var role = new Microsoft.AspNet.Identity.EntityFramework.IdentityRole();
      role.Name = "ROLE NAME";
      roleManager.Create(role);

    }

2
特に移行を使用していなかったので、これは私を助けました。DropCreateDatabaseAlwaysを使用しています。
J86 2015

私の問題は、間違ったコンテキストを使用していたことでした。私は2つの接続文字列を作成しました。1つは呼び出されIdentityDbContext、もう1つはカスタムコンテキストを使用していたので、あなたの提案を使用するとAppilcationDbContext()、それは機能しました。
megamaiku 2017年

var roleManager = new RoleManager <IdentityRole>(new RoleStore <IdentityRole>(db));
Nour Lababidi 2018年

25

これは、ASP.NET Identityを使用してロールを作成、ロールを変更、ロールを削除、およびロールを管理する方法を説明する完全な記事です。これには、ユーザーインターフェイス、コントローラーメソッドなども含まれます。

http://www.dotnetfunda.com/articles/show/2898/working-with-roles-in-aspnet-identity-for-mvc

これが役立つことを願っています

ありがとう


1
あなたのブログは素晴らしいですが、古くなっています。アカウントコントローラーを更新できますか
aggie 2016年

すでにASP.NETMVC 5用です(どのアップデートを探していますか?)。記事で指定されているGitHubリンクからソースコードをダウンロードできます。
Sheo Narayan 2016

1
これらの関数の一部は、最新の2.2.0から非推奨になっているようです。1)私は高く評価されるだろう)アイデンティティとrecpatchaを統合する方法上の任意の提言を3を電子メールで送信するために、私はのGuidからの主キーを変更することができますどのように現在のバージョン2)で同じコードを使用することができますj.mp/1nohaHe
アギー

15

ASP.NET 5 rc1-final、私は次のことをしました:

作成済みApplicationRoleManagerApplicationUserテンプレートによって作成されるのと同様の方法で)

public class ApplicationRoleManager : RoleManager<IdentityRole>
{
    public ApplicationRoleManager(
        IRoleStore<IdentityRole> store,
        IEnumerable<IRoleValidator<IdentityRole>> roleValidators,
        ILookupNormalizer keyNormalizer,
        IdentityErrorDescriber errors,
        ILogger<RoleManager<IdentityRole>> logger,
        IHttpContextAccessor contextAccessor)
        : base(store, roleValidators, keyNormalizer, errors, logger, contextAccessor)
    {
    }
}

ConfigureServicesStartup.cs、私はRoleManagerとしてこれを追加しました

services.
    .AddIdentity<ApplicationUser, IdentityRole>()
    .AddRoleManager<ApplicationRoleManager>();

新しい役割を作成するには、Configure以下から呼び出します。

public static class RoleHelper
{
    private static async Task EnsureRoleCreated(RoleManager<IdentityRole> roleManager, string roleName)
    {
        if (!await roleManager.RoleExistsAsync(roleName))
        {
            await roleManager.CreateAsync(new IdentityRole(roleName));
        }
    }
    public static async Task EnsureRolesCreated(this RoleManager<IdentityRole> roleManager)
    {
        // add all roles, that should be in database, here
        await EnsureRoleCreated(roleManager, "Developer");
    }
}

public async void Configure(..., RoleManager<IdentityRole> roleManager, ...)
{
     ...
     await roleManager.EnsureRolesCreated();
     ...
}

これで、ルールをユーザーに割り当てることができます

await _userManager.AddToRoleAsync(await _userManager.FindByIdAsync(User.GetUserId()), "Developer");

またはAuthorize属性で使用

[Authorize(Roles = "Developer")]
public class DeveloperController : Controller
{
}

services.AddIdentity<UserAuth, IdentityRole>().AddRoleManager<ApplicationRoleManager>()services直接 追加できませんでした。
Alex C

2
@AlexC、すみません、私の悪いです。私はそれをできるだけ単純に保つように努め、AddIdentityを削除しました。修繕。
nothrow 2015

1
そのため、そのコードをスタンドアロンプ​​ロジェクトgithub.com/AlexChesser/AspnetIdentitySample/commit/に追加しました。AspnetRolesは正常に作成されますが、何らかの理由でページが「ホワイトスクリーン」になります(500エラーと想定していますが、スタックトレースなし)これをインストールしてページをレンダリングできましたか?
Alex C

わかりました-このコミットにより、ホワイトスクリーンエラーgithub.com/AlexChesser/AspnetIdentitySample/commit/…が修正されます。EnsureRolesCreated内で、タスクではなくボイドに切り替えたことに注意してください。
Alex C

1
'EnsureRolesCreated'がvoidを返す場合は、構成が
完了する

6

上記のPetersコードの改善として、これを使用できます。

   var roleManager = new RoleManager<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));

   if (!roleManager.RoleExists("Member"))
            roleManager.Create(new IdentityRole("Member"));

3

PeterStulinskiとDaveGordonのコードサンプルをEF6.0で使用したとき、アプリケーションが起動時にハングしていました。私が変更され:

var roleManager = new RoleManager<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));

var roleManager = new RoleManager<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>(new RoleStore<IdentityRole>(**context**));

これは、シードメソッドでの別のインスタンスをインスタンス化したくない場合に意味がありApplicationDBContextます。これは、私がDatabase.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());コンストラクターで持っていたという事実によって悪化した可能性がありますApplicationDbContext


2

ロールビューモデル

public class RoleViewModel
{
    public string Id { get; set; }
    [Required(AllowEmptyStrings = false)]
    [Display(Name = "RoleName")]
    public string Name { get; set; }
}

コントローラ方式

    [HttpPost]
    public async Task<ActionResult> Create(RoleViewModel roleViewModel)
    {
       if (ModelState.IsValid)
       {
           var role = new IdentityRole(roleViewModel.Name);
           var roleresult = await RoleManager.CreateAsync(role);
           if (!roleresult.Succeeded)
           {
               ModelState.AddModelError("", roleresult.Errors.First());
               return View();
           }
           return RedirectToAction("some_action");
       }
       return View();
    }

1

役割を追加するための別のソリューションを共有したいと思いました。

<h2>Create Role</h2>

@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<span class="label label-primary">Role name:</span>
<p>
    @Html.TextBox("RoleName", null, new { @class = "form-control input-lg" })
</p>
<input type="submit" value="Save" class="btn btn-primary" />
}

コントローラ:

    [HttpGet]
    public ActionResult AdminView()
    {
        return View();
    }

    [HttpPost]
    public ActionResult AdminView(FormCollection collection)
    {
        var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));

        if (roleManager.RoleExists(collection["RoleName"]) == false)
        {
            Guid guid = Guid.NewGuid();
            roleManager.Create(new IdentityRole() { Id = guid.ToString(), Name = collection["RoleName"] });
        }
        return View();
    }

1

新しいASP.netWebアプリケーションを選択し、認証として個々のユーザーアカウントを選択したときに作成されるデフォルトのテンプレートを使用していて、ロールを持つユーザーを作成しようとしている場合は、ここに解決策があります。[HttpPost]を使用して呼び出されるAccountControllerのRegisterメソッドで、に次の行を追加しますif condition

Microsoft.AspNet.Identity.EntityFrameworkを使用する;

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

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

if (result.Succeeded)
{
  var roleStore = new RoleStore<IdentityRole>(new ApplicationDbContext());
  var roleManager = new RoleManager<IdentityRole>(roleStore);
  if(!await roleManager.RoleExistsAsync("YourRoleName"))
     await roleManager.CreateAsync(new IdentityRole("YourRoleName"));

  await UserManager.AddToRoleAsync(user.Id, "YourRoleName");
  await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);
  return RedirectToAction("Index", "Home");
}

これにより、最初にデータベースにロールが作成され、次に新しく作成されたユーザーがこのロールに追加されます。


0
    public static void createUserRole(string roleName)
    {
        if (!System.Web.Security.Roles.RoleExists(roleName))
        {
            System.Web.Security.Roles.CreateRole(roleName);
        }
    }

0

ロールの作成に使用する方法を以下に示します。コードでユーザーにロールを割り当てる方法も示しています。以下のコードは、migrationsフォルダーの「configuration.cs」にあります。

string [] roleNames = { "role1", "role2", "role3" };
var RoleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));

                IdentityResult roleResult;
                foreach(var roleName in roleNames)
                {
                    if(!RoleManager.RoleExists(roleName))
                    {
                        roleResult = RoleManager.Create(new IdentityRole(roleName));
                    }
                }
                var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));
                UserManager.AddToRole("user", "role1");
                UserManager.AddToRole("user", "role2");
                context.SaveChanges();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.