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