Привязка объекта ASP.Net Identity к Func с использованием ninject

РЕДАКТИРОВАТЬ: я нашел решение, но если кто-нибудь знает лучший способ, я все уши.

Я работаю над приложением ASP.Net MVC 5 с некоторыми идентификаторами ASP.Net.

У меня есть следующий код (который запускается в Startup.cs при запуске приложения):

 public class Startup
{

    #region Properties/Delegates

    public static Func<UserManager<AppUserModel>> UserManagerFactory { get; private set; }

    #endregion


    public void Configuration(IAppBuilder app)
    {



        // 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("/auth/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<UserManager<AppUserModel>, AppUserModel>(
                    validateInterval: TimeSpan.FromMinutes(30),
                    regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
            }
        });


        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
        app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(5));
        app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie);


        // Configure the user manager
        // We use a delegate here so we can acess the IBuilder
        // Then we bind this delegate to UserManager<AppUserModel> in Ninject
        UserManagerFactory = () =>
        {
            var usermanager = new UserManager<AppUserModel>(
                new UserStore<AppUserModel>(new AppDbContext()));

            usermanager.PasswordHasher = new SQLPasswordHasher();

            // allow alphanumeric characters in username
            usermanager.UserValidator = new UserValidator<AppUserModel>(usermanager)
            {
                AllowOnlyAlphanumericUserNames = false
            };

            usermanager.PasswordValidator = new PasswordValidator
            {
                RequiredLength = 6,
                RequireNonLetterOrDigit = true,
                RequireDigit = false,
                RequireLowercase = false,
                RequireUppercase = false
            };

            usermanager.UserLockoutEnabledByDefault = true;
            usermanager.DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(5);
            usermanager.MaxFailedAccessAttemptsBeforeLockout = 5;

            // Register two factor authentication providers. This application uses Phone and Emails as a step of receiving a code for verifying the user
            // You can write your own provider and plug it in here.
            usermanager.RegisterTwoFactorProvider("Phone Code", new PhoneNumberTokenProvider<AppUserModel>
            {
                MessageFormat = "Your security code is {0}"
            });
            usermanager.RegisterTwoFactorProvider("Email Code", new EmailTokenProvider<AppUserModel>
            {
                Subject = "Security Code",
                BodyFormat = "Your security code is {0}"
            });
            usermanager.EmailService = new EmailService();
            usermanager.SmsService = new SmsService();

            IDataProtectionProvider provider = app.GetDataProtectionProvider();
            if (provider != null)
            {
                IDataProtector dataProtector = provider.Create("ASP.NET Identity");

                usermanager.UserTokenProvider = new DataProtectorTokenProvider<AppUserModel>(dataProtector);
            }


            // use out custom claims provider
            //usermanager.ClaimsIdentityFactory = new AppUserClaimsIdentityFactory();

            return usermanager;
        };

    }

Я хотел бы ввести UserManagerFactory выше вместо UserManager. Я не могу заставить привязку работать.

Что я пробовал:

kernel.Bind<UserManager<AppUserModel>>().To<Startup.UserManagerFactory>();

Что на самом деле сработало:

kernel.Bind<UserManager<AppUserModel>>().ToMethod(context => Startup.UserManagerFactory());

UserManager — это объект, которым владеет Microsoft Identity.

Я хочу внедрить делегата в такие вещи:

private readonly UserManager<AppUserModel> _userManager;

    public AuthController(UserManager<AppUserModel> userManager)
    {
        this._userManager = userManager;
    }

Это основано на http://benfoster.io/blog/aspnet-identity-stripped-bare-mvc-part-2

В разделе «Настройка UserManager и аутентификации». Он вызвал его в конструкторе, вместо которого я выбрал ninject.


person kyurthich    schedule 11.12.2014    source источник
comment
Две вещи: 1) внедрение конструктора всегда должно быть предпочтительнее внедрения свойства, 2) поскольку свойство UserManagerFactory имеет конкретный тип (не абстрактный), почему вообще требуется внедрение для статической функции? По умолчанию привязка вашего ядра в приведенном выше коде будет InTransientScope (по умолчанию Ninject), поэтому для каждой ссылки будет создаваться новый экземпляр, но поскольку функция является статической, этого на самом деле не произойдет. Можете ли вы предоставить больше информации о том, где и как используется этот код?   -  person xDaevax    schedule 12.12.2014
comment
Добавил детали в пост. Пожалуйста ознакомтесь.   -  person kyurthich    schedule 12.12.2014


Ответы (1)


Решено

kernel.Bind<UserManager<AppUserModel>>().ToMethod(context => Startup.UserManagerFactory());

Дайте мне знать, если есть лучший способ!

person kyurthich    schedule 11.12.2014