ユーザーが asp.net mvc Identity のロールに属しているかどうかを確認する 質問する

ユーザーが asp.net mvc Identity のロールに属しているかどうかを確認する 質問する

データベースにユーザーとロールをシードする際に問題が発生しています。

ユーザーとロールの両方が作成されます (エラーがスローされた後、データベースで確認できます)。

ただし、ユーザーがロールに属しているかどうかを確認しようとすると、例外が発生します。

私のコードは次のとおりです:

    public class tbInitializer<T> : DropCreateDatabaseAlways<tbContext>
    {
    protected override void Seed(tbContext context)
    {
        ApplicationDbContext userscontext = new ApplicationDbContext();
        var userStore = new UserStore<ApplicationUser>(userscontext);
        var userManager = new UserManager<ApplicationUser>(userStore);

        var roleStore = new RoleStore<IdentityRole>(userscontext);
        var roleManager = new RoleManager<IdentityRole>(roleStore);


        if(!userscontext.Users.Any(x=> x.UserName=="marktest"))
        {
            var user = new ApplicationUser { UserName = "marktest", Email = "[email protected]" };
            userManager.Create(user, "Pa$$W0rD!");
        }

        if (!roleManager.RoleExists("Admin"))
        { 
            roleManager.Create(new IdentityRole("Admin"));
        }

        if(!userManager.IsInRole("marktest","Admin"))
        { 
            userManager.AddToRole("marktest","Admin");
        }

しかし、次の行に注意してください。

if(!userManager.IsInRole("marktest","Admin"))

次のエラーとともに例外がスローされます:UserId not found.

例外がスローされた後に確認すると、ユーザーとロールは両方ともデータベースに存在します。

DBに追加されたユーザーを表示します

DBに追加されたロールを表示します

私が何を間違っているのか誰か分かりますか?

ご協力ありがとうございます。

マーク

ベストアンサー1

他の誰かがこの問題に遭遇した場合に備えて、解決策を見つけました。

「IsInRole」は UserName 文字列ではなく User.Id を期待しているので、次のように変更しました。

            if (!userManager.IsInRole(user.Id, "Admin"))
            {
                userManager.AddToRole(user.Id, "Admin");
            }

したがって、動作するコードは次のようになります。

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

    var roleStore = new RoleStore<IdentityRole>(userscontext);
    var roleManager = new RoleManager<IdentityRole>(roleStore);

    // Create Role
    if (!roleManager.RoleExists("Admin"))
    { 
        roleManager.Create(new IdentityRole("Admin"));
    }

    if(!userscontext.Users.Any(x=> x.UserName=="marktest"))
    {
        // Create User
        var user = new ApplicationUser { UserName = "marktest", Email = "[email protected]" };
        userManager.Create(user, "Pa$$W0rD!");

        // Add User To Role
        if (!userManager.IsInRole(user.Id, "Admin"))
            {
                userManager.AddToRole(user.Id, "Admin");
            }


    }

それが役に立つことを願います。

マーク

おすすめ記事