实体框架-ASP.NET标识,具有相同用户名但属于不同公司的多个用户.是否覆盖FindAsync



我是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; }
}

任何帮助都是非常受欢迎的!

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

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

我找到了这个线程,它解决了与我相同的问题:如何使用ASP。NET标识

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

我将companyId发送到UserStore,并重写FindByNameAsync函数以对userName和companyId进行筛选。我不喜欢的是我不能使用GetUserAggregateSync函数,因为它是私有的。我的解决方案还有其他缺点吗?

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);
    }
}

相关内容

  • 没有找到相关文章

最新更新