使用不同的字段在ASP.NET标识中进行验证

时间:2014-05-20 17:11:42

标签: c# asp.net asp.net-identity

我使用的是ASP.NET身份,但我想用不同的字段验证用户,而不是使用电子邮件(或用户名)和密码。

在我的场景中,用户有一个键码而不是电子邮件。该密钥代码字段我知道如何通过IdentityUser添加到ApplicationUser,但是当我需要检查它是否存在于数据库中时,我发现了问题。 UserManager有方法可以通过用户名和密码(或电子邮件)查找用户,但不能查找我添加的自定义属性(显然)。

我试图实现自己的UserManager,但对于相当简单的"它似乎是一个很大的努力。事情。我只需要一个额外的方法。

一种解决方案是使用用户名作为存储密钥的字段。但是我不太喜欢这个想法。它不是很干净,感觉像是作弊;我将来可能需要这个领域用于其最初的目的。

在复杂性和清洁解决方案之间做出更好平衡的解决方案是什么?

非常感谢你!

1 个答案:

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