РЕДАКТИРОВАТЬ: я нашел решение, но если кто-нибудь знает лучший способ, я все уши.
Я работаю над приложением 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.
UserManagerFactory
имеет конкретный тип (не абстрактный), почему вообще требуется внедрение для статической функции? По умолчанию привязка вашего ядра в приведенном выше коде будетInTransientScope
(по умолчанию Ninject), поэтому для каждой ссылки будет создаваться новый экземпляр, но поскольку функция является статической, этого на самом деле не произойдет. Можете ли вы предоставить больше информации о том, где и как используется этот код? - person xDaevax   schedule 12.12.2014