为什么SignInManager在登录时获取用户两次?

时间:2016-01-16 15:09:58

标签: asp.net-mvc asp.net-mvc-5 asp.net-identity

SignInManager.PasswordSignInAsync()提供用户名时,首先调用FindByNameAsync(),然后调用FindByIdAsync()。我实现了一个自定义UserStore,但我不明白为什么它同时调用两个数据库调用?这似乎是不必要的开销。

在这两种情况下,我都使用不同的Where标准返回相同的IUser对象。那是我应该做的吗?

public Task<MyAppIdentityUser> FindByIdAsync(long userId)
{
    Task<MyAppIdentityUser> task = _db.Profile.Where(x => x.UserId == userId)
        .Select(x => new MyAppIdentityUser { Id = x.UserId, UserName = x.UserName })
        .FirstOrDefaultAsync();
    return task;
}

public Task<MyAppIdentityUser> FindByNameAsync(string userName)
{
    Task<MyAppIdentityUser> task =  _db.Profile.Where(x => x.UserName == userName)
        .Select(x => new MyAppIdentityUser { Id = x.UserId, UserName = x.UserName })
        .FirstOrDefaultAsync();
    return task;
}

附加 - 我还注意到GetPasswordHashAsync()和GetLockoutEnabledAsync()的第3和第4个查询。为什么所有这些呼叫都是必要的,并且不能在一次呼叫中捆绑在一起?

1 个答案:

答案 0 :(得分:0)

所以我终于在经过一番头疼之后弄明白了。当使用字符串用户名和密码调用SignInManager.PasswordSignInAsync()时,它首先查询数据库以从DB(source code)获取具有其Id密钥的IUser对象。然而,它然后再次使用IUser对象调用自身,但是做了几次检查,一遍又一遍地调用GetUserIdAsync(),尽管经理已经拥有它。不知道为什么开箱即用。