如何使用IEnumerable / Collection属性扩展用户标识

时间:2017-02-07 10:33:05

标签: c# asp.net-mvc asp.net-identity claims-based-identity

与此问题类似:How to extend available properties of User.Identity

当用户登录时,我想加载我的用户与之关联的部门。我猜测我会向ApplicationUser类添加一个属性,如下所示:

public class ApplicationUser : IdentityUser<Guid, GuidUserLogin, GuidUserRole, GuidUserClaim>
    {
        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(ApplicationUserManager manager)
        {
            // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
            var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
            return userIdentity;
        }


        public IEnumerable<Department> Departments { get; set; }
    }

我的问题是我将如何/在哪里填充集合,然后我将如何在控制器中访问该属性。根据我的理解,声明对于简单类型(例如Id)是可以的,但是它们可以与集合一起使用吗?

我假设一旦我加载了这个属性,每次我需要关于用户的信息时,我都可以查询集合而不会访问数据库 - 这通常是。

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:0)

首先,创建集合实体,即Department。然后在其中引用ApplicationUser实体的Id。

假设您首先使用实体​​框架代码,这是一个示例:

public class ApplicationUser : IdentityUser<Guid, GuidUserLogin, GuidUserRole, GuidUserClaim>
    {
        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(ApplicationUserManager manager)
        {
            // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
            var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
            return userIdentity;
        }

        public ApplicationUser()
        {
           Departments = new Collection<Department>();
        }

        public ICollection<Department> Departments { get; set; }
    }



public class Department
{

    public string UserId { get; set; }

    public int DepartmentId { get; set; }

    public ApplicationUser User { get; set; }

    protected Department()
    {

    }

}