UserManager всегда null в приложении ASPNET Identity 2

Настройка:

У меня есть приложение MVC 5 с несколькими библиотечными проектами, созданное с использованием моих собственных экспортированных шаблонов. Экспортированные шаблоны работают нормально.

Я использую ASPNET Identity. Я просто использую копию образца Microsoft Aspnet Identity Sample, представленную в соответствующем пакете NuGet, который я вложил в экспортированные шаблоны. Это работает нормально.

Я не коснулся файлов, представленных в образце ASPNET Identity 2.

Ошибка в файле IdentityConfig.cs.

По какой-то причине он начал придумывать ошибку, заявив, что не смог загрузить файл для System.Web.Mvc, поскольку он не смог найти версию 5.1.0.0.

В результате я использовал NuGet для обновления пакета Microsoft.Aspnet.Mvc. Эта установленная версия 5.2.2.0 system.web.mvc, и это эффективно очистило эту ошибку.

Однако...

Несмотря на то, что приложение загружается, всякий раз, когда я пытаюсь войти в систему или создаю нового пользователя, появляется новая ошибка (показано ниже), в основном заявляя, что объект ASPNET Identity UserManager был нулевым.

Я обновил пакет microsoft.aspnet.identity, но ошибка все еще возникает при попытке войти в систему или создать нового пользователя (страница входа в систему отображается нормально, но ошибка возникает, когда вы нажимаете кнопку входа в систему)

Прежде чем получить сообщение об ошибке system.web.mvc, я мог бы войти и зарегистрировать пользователей на досуге.

Ошибка:

Это ошибка, показанная при попытке входа в систему. Когда я пытаюсь зарегистрировать нового пользователя, я получаю другую ошибку, но по той же причине: объект UserManager равен NULL, когда этого не должно быть.

Object reference not set to an instance of an object.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error: 


Line 324:        public async Task<SignInStatus> PasswordSignIn(string userName, string password, bool isPersistent, bool shouldLockout)
Line 325:        {
Line 326:            var user = await UserManager.FindByNameAsync(userName);
Line 327:            if (user == null)
Line 328:            {

Source File: c:\Users\[user name]\Documents\Visual Studio 2013\Projects\[My solution]\Models\IdentityConfig.cs    Line: 326 

Вопрос:

  • Кто-нибудь знает, что может быть причиной этого?

  • Может ли, например, возможно, что код примера Microsoft Aspnet Identity нуждается в обновлении для версии 5.2.2.0 для system.web.mvc dll?

ПРИМЕЧАНИЕ. Боюсь, я не могу определить или вспомнить, что я изменил, прежде чем произошли ошибки. Я не работал над этим проектом некоторое время.

Ответ 1

После большой боли я нашел ответ:

По какой-то причине загрузочный файл (~/App_Startup/Startup.Auth.cs), который должен был содержать код для настройки owin, не сделал этого. Не знаю, как это произошло.

Итак, я скопировал соответствующий файл из кода Microsoft.Aspnet.Identity.Samples, и теперь он работает. Код:

public partial class Startup
    {
        // For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864
        public void ConfigureAuth(IAppBuilder app)
        {
            // Configure the db context, user manager and role manager to use a single instance per request
            app.CreatePerOwinContext(ApplicationDbContext.Create);
            app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
            app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);
            app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);

            // Enable the application to use a cookie to store information for the signed in user
            // and to use a cookie to temporarily store information about a user logging in with a third party login provider
            // Configure the sign in cookie
            app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                LoginPath = new PathString("/Account/Login"),
                Provider = new CookieAuthenticationProvider
                {
                    // Enables the application to validate the security stamp when the user logs in.
                    // This is a security feature which is used when you change a password or add an external login to your account.  
                    OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                        validateInterval: TimeSpan.FromMinutes(30),
                        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
                }
            });
            app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

            // Enables the application to temporarily store user information when they are verifying the second factor in the two-factor authentication process.
            app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(5));

            // Enables the application to remember the second login verification factor such as phone or email.
            // Once you check this option, your second step of verification during the login process will be remembered on the device where you logged in from.
            // This is similar to the RememberMe option when you log in.
            app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie);

            // Uncomment the following lines to enable logging in with third party login providers
            //app.UseMicrosoftAccountAuthentication(
            //    clientId: "",
            //    clientSecret: "");

            //app.UseTwitterAuthentication(
            //   consumerKey: "",
            //   consumerSecret: "");

            //app.UseFacebookAuthentication(
            //   appId: "",
            //   appSecret: "");

            //app.UseGoogleAuthentication(
            //    clientId: "",
            //    clientSecret: "");
        }
    }

Я использовал код ранее, но в один момент удалял пакеты owin. Я не касался файла вручную, поэтому не знаю, как это произошло.