32

ロールを一覧表示するドロップダウン リスト ボックスがあります。そのロールを持つユーザーのリストを取得したい。「管理者」ロールまたは「CanEdit」ロールにあるユーザーのリストを意味します。これが私のコードです:

public IQueryable<Microsoft.AspNet.Identity.EntityFramework.IdentityUser> 
  GetRolesToUsers([Control] string ddlRole)
{    
  //ddlRole returns role Id, based on this Id I want to list users

  var _db = new ApplicationDbContext();
  IQueryable<Microsoft.AspNet.Identity.EntityFramework.IdentityUser> query = _db.Users;

  if (ddlRole != null)
  {
    //query = query.Where(e => e.Claims == ddlRole.Value);  ???????              
  }

  return query;
}

助けてください。

更新されたコード (まだエラー)

public List<IdentityUserRole> GetRolesToUsers([Control]string ddlRole)
{

  var roleManager = 
   new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));
  var users = roleManager.FindByName("Administrator").Users.ToList();
  return users;
}

エラー: ItemType が "Microsoft.AspNet.Identity.EntityFramework.IdentityUser" に設定されている場合、Select メソッドは "IQueryable"、"IEnumerable"、または "Microsoft.AspNet.Identity.EntityFramework.IdentityUser" のいずれかを返す必要があります。

さまざまなキャスティングを試しましたが、どれも役に立ちませんでした。

更新 (実用的なソリューション)

chris544 のおかげで、彼のアイデアはこれを修正するのに役立ちました。これが作業方法です: -

public List<ApplicationUser> GetRolesToUsers([Control]string ddlRole)
{
  var context = new ApplicationDbContext();
  var users =
    context.Users.Where(x => x.Roles.Select(y => y.RoleId).Contains(ddlRole)).ToList();

  return users;
}
4

8 に答える 8

40

専門家ではありませんが...

Identityにはこれに対する組み込み機能がないようで、組み込みのロールからも機能させることができませんでした(クレームベースのIDでは機能しないようです)。

だから私はこのようなことをしました:

var users = context.Users        
    .Where(x => x.Roles.Select(y => y.Id).Contains(roleId))
    .ToList();
  • x.Roles.Select(y => y.Id)のすべてのロール ID のリストを取得しますuser x
  • .Contains(roleId)この ID のリストに必要な情報が含まれているかどうかをチェックしますroleId
于 2014-05-25T10:23:27.093 に答える
13

ロール名入力でロールを検索します。その後、ロールのIDでリストユーザーを見つけます。

public List<ApplicationUser> GetUsersInRole(string roleName)
{
 var roleManager = 
  new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new  ApplicationDbContext()));
 var role = roleManager.FindByName(roleName).Users.First();
 var usersInRole = 
  Users.Where(u => u.Roles.Select(r => r.RoleId).Contains(role.RoleId)).ToList();
 return usersInRole;
}
于 2014-11-19T17:04:57.270 に答える
4

3 つの方法があります。

Controller では、現在ログインしているユーザーのロールは次のように確認できます。

  if(User.IsInRole("SysAdmin"))
        {

外部コントローラーでは、特定のユーザーがロールに属しているかどうかを次のように確認できます。

 ApplicationUserManager UserManager = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
        var roles = UserManager.GetRoles(userid);
        if (roles.Contains("SysAdmin"))
        {
        }

名前空間を追加することを忘れないでください。

using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;

統合テストなどのいくつかの理由で、次のように EF を直接使用してユーザーのロールを見つけたい場合があります。

string userId = User.Identity.GetUserId();
        ApplicationDbContext db = new ApplicationDbContext();
        var role = (from r in db.Roles where r.Name.Contains("Admin") select r).FirstOrDefault();
        var users = db.Users.Where(x => x.Roles.Select(y => y.RoleId).Contains(role.Id)).ToList();
        if (users.Find(x => x.Id == userId) != null)
        {
            // User is in the Admin Role
        }

それが役に立てば幸い。

ありがとう /dj @debug_mode

于 2014-10-28T20:20:17.293 に答える
0

私のために働くコードは次のとおりでした:

  var users = roleManager.FindByName(roleName).Users.Select(x => x.UserId);
  var usersInRole = Users.Where(u => users.Contains(u.Id));
于 2016-10-29T15:33:09.497 に答える
0

を削除し.Emailて追加するUserNameか、名前に追加されたものを何でも追加しASPNetUsersます。

private void AddAddminToMail(MailMessage message)
{
    var roles = db.Roles.Include(m => m.Users).Where(m => m.Name == "Admin").First();
    foreach (var user in roles.Users)
        {
            var id = user.UserId;
            var userEmail = db.Users.Find(id).Email;
            message.To.Add(userEmail);
        }      
}
于 2016-04-25T15:15:23.673 に答える