vДалее. AspNet.Identity и пользовательское хранилище UserStore. Устраненное исключение UserStore

Я пытаюсь понять vNext.
Я написал собственный UserStore, который работает с MongoDB и реализует следующие интерфейсы:

  public class UserStore : IUserStore<ApplicationUser>, IUserPasswordStore<ApplicationUser>, IUserSecurityStampStore<ApplicationUser>,
    IUserLoginStore<ApplicationUser>, IUserClaimStore<ApplicationUser>, IUserEmailStore<ApplicationUser>, IUserRoleStore<ApplicationUser>,
    IUserTwoFactorStore<ApplicationUser>

В Startup.cs добавлено:

app.UseServices(services =>
        {

            services.AddIdentity<ApplicationUser>()
                .AddUserStore(() => { return new UserStore(); })
                .AddUserManager<UserManager<ApplicationUser>>()
                .AddHttpSignIn();

            services.AddMvc();
        });

Затем попытался использовать неизмененный AccountController из шаблона Visual Studio и столкнулся с проблемами.
При входе в систему я получаю ObjectDisposedException в UserStore.FindByNameAsync() -- нечто, называемое UserStore.Dispose().
В коде UserManager на github. com/aspnet Store.Dispose() вызывается только в UserManager.Dispose().
Я могу просто игнорировать вызовы Dispose и все работает нормально, но это не очень хороший способ.
Так что я понятия не имею, что мне делать

P.S. Вопрос: что (и почему) может вызвать UserStore.Dispose()?




Ответы (1)


В vNext DI встроен и управляет жизненным циклом служб идентификации. Вероятно, вы пытаетесь использовать удостоверение после того, как службы были удалены, по умолчанию службы удостоверений имеют время жизни, привязанное к запросу, поэтому, если, например, вы пытаетесь удержать ссылку на диспетчера пользователей и повторно использовать ее для нескольких запросов, это вызовет исключение ObjectDisposedException.

person Hao Kung    schedule 03.09.2014
comment
UserManager я получил из конструктора параметров AccountController(UserManager, SignInManager). - person no_one; 04.09.2014