3

我是 MVC 和 EF 的新手,我正在开发一个使用 Identity 进行用户和角色管理的项目。在 Visual Studio 的预定义登录函数中,有一个名为 FindAsync 的函数,用于通过用户名和密码获取用户。在我的情况下,可以有多个用户具有相同的用户名和密码,但他们将属于不同的公司。我想知道最好的方法;我应该重写 FindAsync 函数(以及其他必要的函数)并添加另一个参数,还是应该在没有 Identity 的情况下自己实现用户和角色管理?或者还有其他更好的解决方案吗?

如果最好的解决方案是覆盖该函数,那么我有点不确定我应该怎么做,因为 UserManager 的源代码还没有打开。

您可以在下面找到我的模型的登录功能和外卖:

    public async Task<ActionResult> Login(Login model, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            var user = await UserManager.FindAsync(model.UserName, model.Password);
            if (user != null)
            {
                await SignInAsync(user, model.RememberMe);
                return RedirectToLocal(returnUrl);
            }
            else
            {
                ModelState.AddModelError("", "Invalid username or password.");
            }
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }

public class Company
{
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
    public virtual ICollection<User> Users { get; set; }
    public virtual ICollection<Role> Roles { get; set; }
}

public class User : IdentityUser
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    [Required]
    public virtual int CompanyId { get; set; }
    [Required]
    public virtual Company Company { get; set; }
}

任何帮助都非常受欢迎!

4

3 回答 3

2

我想我会创建自己的实现UserManager并创建一个类似的方法FindByCompanyAsync(string userName, string password, string companyName)

在这种方法中,您可以通过获取 UserManager 的所有用户来搜索用户,并使用 LINQ 表达式根据用户名和公司名称对其进行过滤。

于 2014-05-02T15:36:12.233 回答
0

我将 companyId 发送到 UserStore 并覆盖 FindByNameAsync 函数以过滤 userName 和 companyId。我不喜欢的是我不能使用 GetUserAggregateAsync 函数,因为它是私有的。我的解决方案还有其他缺点吗?

public class UserStore : UserStore<User>
{
    public int companyId = -1;

    public UserStore(DbContext context, int companyId)
        : base(context)
    {
        this.companyId = companyId;
    }

    public override Task<User> FindByNameAsync(string userName)
    {
        if (companyId < 0)
        {
            throw new Exception("There is no companyId associated with the UserStore.");
        }
        return QueryableExtensions.FirstOrDefaultAsync<User>(QueryableExtensions.Include<User, ICollection<IdentityUserLogin>>(QueryableExtensions.Include<User, ICollection<IdentityUserClaim>>(QueryableExtensions.Include<User, ICollection<IdentityUserRole>>(this.Users, (User u) => u.Roles), (User u) => u.Claims), (User u) => u.Logins), (User u) => u.UserName.ToUpper() == userName.ToUpper() && u.CustomerId == this.companyId);
    }
}
于 2014-05-18T15:13:33.120 回答
0

我找到了这个线程,它解决了与我相同的问题: How to implement Multi-tenant User Login using ASP.NET Identity

这似乎是一个很好的方法,我会像他一样尝试自己实现 UserStore。

于 2014-05-16T16:01:52.157 回答