Asp.net mvc 5 如何从ASP.NET Identity 2获取用户子集

Asp.net mvc 5 如何从ASP.NET Identity 2获取用户子集,asp.net-mvc-5,asp.net-identity-2,Asp.net Mvc 5,Asp.net Identity 2,使用默认ASP.NET MVC 5模板的稍加修改的版本(使用个人帐户),我试图基于中间表获取用户子集。我已经建立了一个管理UI,可以返回所有用户的列表,但是现在我需要根据中间表中定义的当前登录用户的访问权限限制返回的用户集 基本上,每个用户都可以访问一个或多个诊所,因此他们可以访问的每个诊所都有一个记录 如果当前登录的用户属于给定角色(例如,“诊所管理员”),则他们应该能够检索属于他们有权访问的任何诊所的任何用户的列表 有人能帮我指出正确的方向吗?这是我的第一个Anything.NET应用程序,

使用默认ASP.NET MVC 5模板的稍加修改的版本(使用个人帐户),我试图基于中间表获取用户子集。我已经建立了一个管理UI,可以返回所有用户的列表,但是现在我需要根据中间表中定义的当前登录用户的访问权限限制返回的用户集

基本上,每个用户都可以访问一个或多个诊所,因此他们可以访问的每个诊所都有一个记录

如果当前登录的用户属于给定角色(例如,“诊所管理员”),则他们应该能够检索属于他们有权访问的任何诊所的任何用户的列表

有人能帮我指出正确的方向吗?这是我的第一个Anything.NET应用程序,请随意解释,就像我五岁一样。:-)

提前感谢您提供的任何帮助

其他信息:

  • Visual Studio 2013更新5
  • 实体框架6
  • MS SQL Server 2008 R2
以下是中间表的类(用户):

这是我的ApplicationUser类:

public class ApplicationUser : IdentityUser
{
    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string FullName
    {
        get { return FirstName + " " + LastName; }
    }

    [ForeignKey("ClinicUsers")]
    public override string Id
    {
        get
        {
            return base.Id;
        }
        set
        {
            base.Id = value;
        }
    }

    public virtual ClinicUser ClinicUsers { get; set; }

    public IEnumerable<SelectListItem> RolesList { get; set; }

    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        userIdentity.AddClaims(ClinicClaimsProvider.GetClaims(userIdentity));
        return userIdentity;
    }
}

不久前我解决了这个问题,但我想我最好回到这里,用答案更新我的问题,以防这可能会帮助其他人

我相应地更新了我的Clinic和ClinicUser类:

Clinic.cs

[Table("clinics")]
public class Clinic
{
    [Key]
    public System.Guid ClinicId { get; set; }

    public List<ClinicUser> ClinicUsers { get; set; }
}
此外,我还更新了ApplicationUser类的以下摘录:

[ForeignKey("ClinicUsers")]
public override string Id
{
    get
    {
        return base.Id;
    }
    set
    {
        base.Id = value;
    }
}

public virtual ClinicUser ClinicUsers { get; set; }
为此:

public List<ClinicUser> ClinicUsers { get; set; }
公共列表用户{get;set;}
最后,在ApplicationUsersController的Index()操作中,我能够使用以下内容:

   public async Task<ActionResult> Index()
    {
        if (User.IsInRole("Admin")) return View(await UserManager.Users.ToListAsync());

        var userId = User.Identity.GetUserId();

        //Get the Ids of the current user's clinics
        var userClinics = db.ClinicUsers.Where(cu => cu.UserId == userId).Select(cu => cu.ClinicId).ToList();

        //Get all userIds of the user at the current user's clinics 
        var clinicUserIds = db.ClinicUsers.Where(cu => userClinics.Contains(cu.ClinicId)).ToList().Select(cu => cu.UserId);

        var users = UserManager.Users.Where(u => clinicUserIds.Contains(u.Id));

        return View(await users.ToListAsync());
    }

public async Task)以获得他有用的响应。

首先,不要在ApplicationUser类中使用太多属性,您可以管理user profiles表并将其与application user类连接,这样您就可以在profile表中放置大量有关用户的信息。 下一个任务是组织诊所、分支机构等的表格。。。并将应用程序用户与他们联系起来。 接下来有两种方法: 1.将应用程序用户与诊所或分支机构联系起来。 或 2.使用角色管理它们

以下是应用程序用户的示例:

[Table("Clinics")]
public class Clinic
{
    [Key]
    public string Id { get; set; }

    public virtual ICollection<ClinicUser> ClinicUsers { get; set; }
}

[Table("ClinicUsers")]
public class ClinicUser
{
    [Key]
    [Column(Order = 0)]
    public string ClinicId { get; set; }

    [Key]
    [Column(Order = 1)]
    public string UserId { get; set; }
}
[表(“诊所”)]
公立诊所
{
[关键]
公共字符串Id{get;set;}
公共虚拟ICollection用户{get;set;}
}
[表(“临床用户”)]
公共类用户
{
[关键]
[第列(顺序=0)]
公共字符串ClinicId{get;set;}
[关键]
[第列(顺序=1)]
公共字符串用户标识{get;set;}
}
因此,接下来您需要其他ViewModel来显示它们,希望对您有所帮助

更新

// GET: ClinicUsers by Clinic
    public async Task<ActionResult> ViewCurrentClinicUsers(string id) // This is clinis ID
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        Clinic clinic = await db.clinic.FindAsync(id); // Get Selectedclinic
        if (clinic == null)
        {
            return HttpNotFound();
        }
        ClinicUsers model = new ClinicUsers() // ClinicUsers model
        {
            clinic = clinic, // View Currentclinic
            ClinicUsers = await db.ClinicUsers.Were(x => x.clinicid == clinic.id)ToListAsync()) // Get Users that asigned to current clinic
        };
        return View(model);
    }
//获取:诊所用户
公共异步任务ViewCurrentClinicUsers(字符串id)//这是clinis id
{
if(id==null)
{
返回新的HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Clinic Clinic=wait db.Clinic.FindAsync(id);//获取Selectedclinic
if(clinic==null)
{
返回HttpNotFound();
}
ClinicUsers模型=新的ClinicUsers()//ClinicUsers模型
{
诊所=诊所,//查看当前诊所
ClinicUsers=wait db.ClinicUsers.Were(x=>x.clinicid==clinic.id)ToListSync()//获取已登录到当前诊所的用户
};
返回视图(模型);
}
更新2 最后,如果您想要显示,则指定当前登录用户

// GET: Clinics by currentuser
    public async Task<ActionResult> ViewClinicsWithCurrentUserAccess() 
    {
        var currentuserId = User.Identity.GetUserId(); // This gets currentloged user id
        var currentuser = await db.Users.SingleOrDefaultAsync(x => x.Id == myUserId); // This gets currentloged user virtual
        return View(await db.Clinics.Were(x => x.clinicuserid == currentuserId).ToListAsync());
    }
//GET:Clinics by currentuser
公共异步任务ViewClinicsWithCurrentUserAccess()
{
var currentuserId=User.Identity.GetUserId();//这将获取当前记录的用户id
var currentuser=await db.Users.SingleOrDefaultAsync(x=>x.Id==myUserId);//这将获取当前记录的虚拟用户
返回视图(wait db.Clinics.Were(x=>x.clinicuserid==currentuserId.toListSync());
}

谢谢你的建议,阿切尔。让我们假设我的课程就是你在这里的方式。我的问题是,如何根据我与这些用户的共同诊所,只返回我有权查看的那些应用程序用户的列表。阿切尔,如果你有机会,请查看我的原始帖子。我添加了一条SQL语句,它完成了我想要实现的目标。阿切尔,这非常有用,但与我想要的仍然有些不同。两件事:1)我认为我不需要新的视图模型。我将返回相同的模型到我的视图IEnumerable。唯一的区别是,我不一定需要AspNetUsers表中的所有用户。第二件事:你的例子很接近,但不是只让我访问一个特定诊所的所有用户。我想获取我可以访问的所有诊所的所有用户。当然,我可能想深入到某个特定的诊所,但我也希望一次完成所有这些工作。我好像就是做不好。感谢您提供的有用建议和示例。我们正在讨论与所有诊所一起查看所有诊所以及与所有诊所一起查看其用户是吗?
[Table("Clinics")]
public class Clinic
{
    [Key]
    public string Id { get; set; }

    public virtual ICollection<ClinicUser> ClinicUsers { get; set; }
}

[Table("ClinicUsers")]
public class ClinicUser
{
    [Key]
    [Column(Order = 0)]
    public string ClinicId { get; set; }

    [Key]
    [Column(Order = 1)]
    public string UserId { get; set; }
}
// GET: ClinicUsers by Clinic
    public async Task<ActionResult> ViewCurrentClinicUsers(string id) // This is clinis ID
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        Clinic clinic = await db.clinic.FindAsync(id); // Get Selectedclinic
        if (clinic == null)
        {
            return HttpNotFound();
        }
        ClinicUsers model = new ClinicUsers() // ClinicUsers model
        {
            clinic = clinic, // View Currentclinic
            ClinicUsers = await db.ClinicUsers.Were(x => x.clinicid == clinic.id)ToListAsync()) // Get Users that asigned to current clinic
        };
        return View(model);
    }
// GET: Clinics by currentuser
    public async Task<ActionResult> ViewClinicsWithCurrentUserAccess() 
    {
        var currentuserId = User.Identity.GetUserId(); // This gets currentloged user id
        var currentuser = await db.Users.SingleOrDefaultAsync(x => x.Id == myUserId); // This gets currentloged user virtual
        return View(await db.Clinics.Were(x => x.clinicuserid == currentuserId).ToListAsync());
    }