1

EDIT: Я нашел решение, но если кто-то знает лучший способ, я все уши.Связывание объекта 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.

+0

Две вещи: 1) Инъекция конструктора всегда должна быть предпочтительной выше. Вложение свойств, 2) Поскольку свойство 'UserManagerFactory' имеет конкретный тип (не абстрактный), почему существует необходимость в инъекции вообще для статической функции? Ядро привязки по умолчанию в коде выше будет 'InTransientScope' (Ninject по умолчанию), поэтому новый экземпляр будет создан для каждой ссылки, но поскольку эта функция является статической, это фактически не произойдет. Можете ли вы предоставить больше контекста о том, где/как этот код используется? – xDaevax

+0

Добавлена ​​деталь к сообщению. Пожалуйста ознакомтесь. – kyurthich

ответ

0

решаемые

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

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

Смежные вопросы