我使用的是ASP.NET身份,但我想用不同的字段验证用户,而不是使用电子邮件(或用户名)和密码。
在我的场景中,用户有一个键码而不是电子邮件。该密钥代码字段我知道如何通过IdentityUser
添加到ApplicationUser
,但是当我需要检查它是否存在于数据库中时,我发现了问题。 UserManager
有方法可以通过用户名和密码(或电子邮件)查找用户,但不能查找我添加的自定义属性(显然)。
我试图实现自己的UserManager
,但对于相当简单的"它似乎是一个很大的努力。事情。我只需要一个额外的方法。
一种解决方案是使用用户名作为存储密钥的字段。但是我不太喜欢这个想法。它不是很干净,感觉像是作弊;我将来可能需要这个领域用于其最初的目的。
在复杂性和清洁解决方案之间做出更好平衡的解决方案是什么?
非常感谢你!
答案 0 :(得分:2)
限制在 IUserStore (只有Create,Update,Delete,FindById和FindByName(用户名)方法)中,这是 UserManager 用于检索数据的内容来自数据库。因此,如果您希望使用通过键代码为用户提供的新功能扩展 UserManager ,您还需要扩展 IUserStore 。
总的来说,我不喜欢将“错误数据”放入属性的解决方案。因此,要扩展UserManager和UserStore以满足您的需求,您可以这样做:
首先扩展IUserStore接口
public interface IMyUserStore : IUserStore<User>
{
Task<User> FindByKeyCodeAsync(string keyCode);
}
实施新界面
public class MyUserStore : UserStore<User>, IMyUserStore
{
public Task<User> FindByKeyCodeAsync(string keyCode)
{
return Users.Where(x => x.KeCode == keyCode);
}
}
扩展UserManager
public class MyUserManager : UserManager<User>
{
private readonly IMyUserStore _store;
public MyUserManager(IMyUserStore store)
: base(store)
{
_store = store;
}
public virtual Task<User> FindByKeyCodeAsync(string keyCode)
{
var a = new UserStore<User>();
return _store.FindByKeyCodeAsync(keyCode);
}
}
如果您想通过任何参数获取用户,您可以将FindByKeyCodeAsync方法更改为:
public Task<User> Find(Expression<Func<User, bool>> expression)
{
return Users.SingleAsync(expression);
}