2016-12-08 16 views
1

私はASP.NET MVC 5でアプリケーションを開発していますが、私はEntity Frameworkを使用しています。私は自分のプロジェクトの開始としてVisual Studioで提供されているテンプレートプロジェクトを使用しています。ユーザーとロールのViewModelを作成して、そこにあるすべてのロールに対してユーザーリストを表示したいと考えています。ASP MVCユーザーとロールのリスト

ベースのプロジェクトは、私には意味をなさないテーブルAspNetUsersAspNetUserRolesが含まれています。私はidentityによって提供されたRoleManagerクラスを使用して役割を追加し、その役割にユーザーを追加することができました。

protected override void Seed(Project.Models.ApplicationDbContext context) 
{ 
    var roleStore = new RoleStore<IdentityRole>(context); 
    var roleManager = new RoleManager<IdentityRole>(roleStore); 
    const string roleName = "admin"; 
    var role = roleManager.FindByName(roleName); 
    if (role == null) 
    { 
     role = new IdentityRole(roleName); 
     var roleresult = roleManager.Create(role); 
    } 

    var rolesForUser = userManager.GetRoles(user.Id); 
    if (!rolesForUser.Contains(role.Name)) 
    { 
     var result = userManager.AddToRole(user.Id, role.Name); // user.Id is retrieved accordingly 
    } 
} 

これはすべて動作します。しかし、今私は実際にすべてのユーザーとそれらに対するロールをどのように見ることができるのか混乱しています。具体的には、AspNetUserRolesのデータをモデルにバインドし、次にViewModelにバインドして、 ? (私はこれらのユーザーを管理するための管理パネルを作成しようとしています)。

私はおそらくIdentityRolesクラスを拡張してAspNetRolesのいくつかのコントロールを得ることができることを前提としていますか?しかし、IdentityUserRoleクラスもありますか?

私はこの問題の提案にアプローチする方法が非常に混乱しており、指針は高く評価されます。

答えて

0

私は、実際のソリューションを知らないが、私はそれはいくつかの方法であなたを助けるかもしれないかother.Iは私のプロジェクトのために私自身のRoleProviderとのMembershipProviderを作成しようとした思考この情報を共有しています。私はこれらの抽象クラスを実装しなければならなかったので、ユーザーに関連するデータを変更するための関数を含んでいました。 これらは....

public class MyMembershipProvider : MembershipProvider 
{ UserDb ObjDb; 
    UserBs objbs; 

public MyMembershipProvider() 
    { 
     ObjDb = new UserDb(); 
     objbs = new UserBs(); 
    } 

    public override string ApplicationName 
    { 
     get 
     { 
      throw new NotImplementedException(); 
     } 

     set 
     { 
      throw new NotImplementedException(); 
     } 
    } 

    public override bool EnablePasswordReset 
    { 
     get 
     { 
      throw new NotImplementedException(); 
     } 
    } 

    public override bool EnablePasswordRetrieval 
    { 
     get 
     { 
      throw new NotImplementedException(); 
     } 
    } 
} 

をメンバシッププロバイダでの機能の一部であり、これらは、これはあなたが探していたものにやや近い希望

public class MyRoleProvider:RoleProvider 
{ UserDb ObjDb; 

public MyRoleProvider() 
    { 
     ObjDb = new UserDb(); 
    } 
    public override string ApplicationName 
    { 
     get 
     { 
      throw new NotImplementedException(); 
     } 

     set 
     { 
      throw new NotImplementedException(); 
     } 
    } 

    public override void AddUsersToRoles(string[] usernames, string[] roleNames) 
    { 
     throw new NotImplementedException(); 
    } 

    public override void CreateRole(string roleName) 
    { 
     throw new NotImplementedException(); 
    } 

    public override bool DeleteRole(string roleName, bool throwOnPopulatedRole) 
    { 
     throw new NotImplementedException(); 
    } 

    public override string[] FindUsersInRole(string roleName, string usernameToMatch) 
    { 
     throw new NotImplementedException(); 
    } 

    public override string[] GetAllRoles() 
    { 
     throw new NotImplementedException(); 
    } 
    } 

RoleProvider

にいくつかの機能です。ではごきげんよう。 RoleProviderの中であなたが話していると思う機能は次のとおりです。

public class MyRoleProvider:RoleProvider 
    { UserDb ObjDb; 
    public override string[] GetRolesForUser(string username) 
    { 
     string[] s = { ObjDb.GetAll().Where(x => x.Username ==username.ToUpper()).FirstOrDefault().Privleges }; 
     return s; 
    } 
    } 

この機能を使用して、ユーザーの役割/ Privelegeを取得します。次に、IPrincipalクラスに既に存在するIsInRole関数を使用して、プロジェクトのどこでも使用します。 App_Start/Startup.Auth.cs

if (User.IsInRole("SUPERADMIN")) 
     { 
      //Do something for SUPERADMIN 
     } 
+0

はIdentityUser' 'からあなたのUserクラスを継承していますか?これが私の混乱の原因です。私は 'db.MyIdentityUser.Roles'によって' IdentityUserRoles'からロールのリストを取得できるようになりましたが、これは 'Role'オブジェクトではなくIDのリストとして返されます。 'IdentityRole'を' IdentityUser'に結びつける方法、具体的には 'Microsoft.AspNet.Identity'からどのようにこれらのクラスを実装できるのか、私は思っています。 – Toby

+0

@Toby .....はいToby ... RoleProviderにGetRolesForUserという関数があり、そこではユーザーの役割を取得するLINQクエリを作成し、User.IsInRole( "ADMIN" )..... – Sudhanshu

0

このようなロールマネージャ登録:アクションメソッドがこれを書くに続いて

public void ConfigureAuth(IAppBuilder app) 
{ 
    app.CreatePerOwinContext(ApplicationDbContext.Create); 
    app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); 
    app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create); 

    // register role manager 
    app.CreatePerOwinContext<RoleManager<IdentityRole>>((o, c) => 
     new RoleManager<IdentityRole>(
      new RoleStore<IdentityRole>(c.Get<ApplicationDbContext>()))); 
    // other codes here 
} 

を:

var users = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>().Users; 
var roles = HttpContext.GetOwinContext().GetUserManager<RoleManager<IdentityRole>>().Roles; 

var usersWithRoles= users.Select(u => 
    new 
    { 
     UserName = u.UserName, 
     Roles = roles.Where(r => u.Roles.Any(ur => ur.RoleId == r.Id)).Select(r => r.Name) 
    }) 
    .ToList(); 
+0

'ConfigureAuth'に何が起こっているのか説明できますか? –

+1

@BradleyUffner私はOWINのコンテキストにロールマネージャーを登録しました。だから、リクエストごとにロールマネージャが生成されるので、 'HttpContext.GetOwinContext()'メソッドを呼び出すことでアクセスできます。 –

関連する問題