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

Настраивать:

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

Я использую ASPNET Identity. Я просто использую копию образца удостоверения Microsoft Aspnet, поставляемого в соответствующем пакете 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 

Вопрос:

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

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

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


person awrigley    schedule 14.10.2014    source источник


Ответы (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. Я не трогал файл вручную, поэтому до сих пор не знаю, как это произошло.

person awrigley    schedule 16.10.2014
comment
Привет. Где я могу найти ApplicationRoleManager? - person 3 rules; 26.09.2016
comment
Я выполнил несколько руководств по добавлению OWIN/аутентификации в существующий проект MVC, однако я продолжал получать следующее значение, которое не может быть нулевым. Имя параметра: userManager В моем классе Startup.cs у меня было app.CreatePerOwinContext‹ApplicationSignInManager›(ApplicationSignInManager.Create); app.CreatePerOwinContext(CourseContext.Create); app.CreatePerOwinContext‹ApplicationUserManager›(ApplicationUserManager.Create); Сравнивая мой код с вашим, оказывается, все, что мне нужно было сделать, это переместить мой ApplicationUserManager.Create до ApplicationSignInManager.Create. - person Chris; 02.11.2016
comment
У меня была такая же проблема, и это было связано с тем, что в файле Startup.cs отсутствовала следующая строка: ConfigureAuth(app); - person Alexandre; 12.03.2018