【问题标题】:Retrieve Role for a User in the DAL using ASP.NET Identity使用 ASP.NET 标识在 DAL 中检索用户的角色
【发布时间】:2018-02-13 16:13:49
【问题描述】:

我有一个使用 ASP.NET 身份的用户和角色的沼泽标准实现:

public class User : IdentityUserBase { }
public class Role : IdentityRoleBase { }
public class UserRole : IdentityUserRoleBase { }

我需要 User 类中的属性或方法返回用户的(第一个)角色(在我的应用中,每个用户只能有一个):

public class User : IdentityUserBase
{
  // ...
  public Role GetRole()
  {
    return this.Roles.FirstOrDefault(); // this actually returns a UserRole object, with only a UserId and a RoleId available (no Role object)
  }
}

有没有办法在 DAL 中做到这一点?

我知道在 UI 层可以使用 RoleManager、DbContext 或 HTTPContext 等全局对象,但我无法访问 User 类中的对象(并且不想将它们作为参数传递)。

我原以为这一定是一个标准用例,但我找不到答案……我的问题与this one 基本相同,但我需要访问用户对象本身中的角​​色信息.

【问题讨论】:

  • 这个问题听起来更像是一个糟糕的设计决策。用户类不应该知道如何获取数据,它应该在实例化时由任何创建它的工厂填充。你应该反转控制.. IE RoleManager.PopulateRoleFor(user); 更有意义。
  • 类不需要知道如何获取数据;它只需要得到它。我需要一个快速的小方法或属性来告诉我用户的角色是什么——又好又简单。你的设计,虽然无疑更现代,但对我来说意义不大......
  • @EdGraham 这是针对任何用户还是针对正在执行当前请求的用户?
  • @trailmax 这适用于任何用户。我想遍历用户并确定每个用户的(第一个)角色。而且我想我刚刚找到了答案……

标签: c# entity-framework asp.net-identity


【解决方案1】:

首先,您不应该将GetRole 方法放在User 类中,保持这些模型简单明了。

要获取用户的角色,您需要 db 上下文和用户 ID,您可以这样做:

var userId = ...; //Get the User ID from somewhere

var roles = context.Roles
    .Where(r => r.Users.Any(u => u.UserId == userId))
    .ToList();

【讨论】:

  • 谢谢大卫;但我需要一种询问用户对象的方法,以便找出我正在查看的用户的角色。我没有对 User 类中的全局上下文对象的引用。
  • 你不能。用户对象将只包含 IdentityUserRole 对象,即使这样,如果您的查询没有请求它们,也不能保证它们会被包含在内。请记住,这些东西来自数据库,您不能凭空变魔术 :)
  • 这就是为什么我说你不应该用这样的函数污染你的用户类。
  • 感谢您的回答,大卫。我会认为能够询问用户对象以找出它的角色并不会污染我的用户类,而是让它在功能上有用。在其他 Code-First EF 项目中,我可以通过设置导航属性对其他类执行等效操作;我不太明白为什么这不能用 ASP.NET Identity 轻松完成。
  • 角色仍然只是另一个导航类,唯一的区别是它们已经为您设置好了。
【解决方案2】:

这行得通:

public class UserRole : IdentityUserRoleBase
{
    public virtual Role Role { get; set; } // add this to see roles
    public virtual User User { get; set; } // add this to see users
}

UserRole 属性现在通过 UserRole 属性公开,该属性可通过 User 对象获得。

回顾 ASP.NET Identity here 的演变过程,这些属性在版本 1 中默认存在于 IdentityUserRole 中,但随后在版本 2 中被删除以支持通用主键,建议使用UserManager 班级。但是,这对像我这样需要在 DAL 中完成操作并且无法轻松访问此类(或任何上下文类)的情况没有帮助。鉴于我永远不会有任何其他类型的主键,这样做感觉很安全。

【讨论】:

    猜你喜欢
    • 2020-05-01
    • 2016-04-25
    • 1970-01-01
    • 2016-08-26
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    相关资源
    最近更新 更多