使用ASP.NET标识在DAL中检索用户的角色

时间:2018-02-13 16:13:50

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

我使用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基本相同,但我需要访问其中的角色信息用户对象本身。

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

这有效:

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身份here的演变,这些属性默认情况下在版本1中出现在IdentityUserRole中,但随后在版本2中删除,以便支持通用主键,建议使用UserManager类。但是,这对像我这样的情况没有帮助,这些情况需要在DAL中完成操作,并且不能轻松访问这个类(或任何上下文类)。鉴于我永远不会有任何其他类型的主键,这样做感觉非常安全。