【问题标题】:MVC 5 Identity 2 - customer UserStore methods not being calledMVC 5 Identity 2 - 未调用客户 UserStore 方法
【发布时间】:2024-01-23 22:11:01
【问题描述】:

我正在尝试为我的 MVC 5 应用程序实现一个自定义 UserStore,以便我可以将数据库命令委托给我现有的数据库项目。

我的数据库中的表使用整数键,因此我创建了一个自定义 UserManager,它继承 UserManager<User, int> 而不仅仅是 UserManager<User>。出于这个原因,我还创建了一个自定义 UserStore,它实现了IUserPasswordStore<User, int> 而不仅仅是IUserPasswordStore<User>

简单地说:

public class CustomUserManager : UserManager<User, int>
{
    public CustomUserManager(CustomUserStore store) : base(store) 
    {
    }
}

public class CustomUserStore : IUserPasswordStore<User, int>
{
    private readonly DbContext _db;

    public CustomUserStore(DbContext db)
    {
        _db = db;
    }

    public Task<User> FindByIdAsync(int userId)
    {
        return _db.users.SingleOrDefaultAsync(u => u.Id == userId);
    }

    public Task UpdateAsync(User user)
    {
        _db.Entry(user).State = System.Data.Entity.EntityState.Modified;
        return _db.SaveChangesAsync();
    }
}

现在,似乎当我在 CustomUserManager 上调用 UpdateAsync 时,它并没有通过我的自定义 CustomUserStore,而是通过一些默认实现或其他方式。问题很明显,因为CustomUserManager.UpdateAsync() 返回Task&lt;IdentityResult&gt;,而我在CustomUserStore 中的实现只返回Task。因此没有错误或任何东西,但没有调用该方法。我认为IUserPasswordStore&lt;User, int&gt; 应该有一些方法UpdateAsync 返回Task&lt;IdentityResult&gt;,但它没有......

另一方面,FindByIdAsync 方法确实可以正常工作,并在我的 CustomUserStore 中调用该方法。

我很确定问题是由于继承了具有自定义键类型(在我的情况下为 int)的类。我可以在网上找到的自定义 UserStore 的任何示例都只使用字符串键并且不继承 IUserStore&lt;User, int&gt; 而只是 IUserStore&lt;User&gt;

但是我无法弄清楚我的问题。也许我可以重写CustomUserManager 中的所有方法,但这似乎是一种变通方法,而不是一种解决方案。这可能是框架中的错误吗,我认为自定义键类型仍然相对较新,甚至处于 alpha 阶段?

【问题讨论】:

  • 你能解决这个问题吗?

标签: asp.net-mvc model-view-controller identity asp.net-identity-2


【解决方案1】:

我知道这是一个老问题,但我昨天在同样的问题上苦苦挣扎,在花了一些时间之后,我决定查看 Identity 源代码以及我发现的内容,几乎让我崩溃了头靠墙……

很简单,如果您在基类中调用UserManager.UpdateAsync,您将看到在UserStore.UpdateAsync 之前发生了一个验证,在我的情况下,验证失败(不管原因)。所以,请善待并检查您的班级(控制器班级)UpdateAsync 的结果,这是一个IdentityResult,然后确定Succes 结果为假。

埃夫丁

【讨论】: