В базовом шаблоне при создании asp.net mvc проекта в качестве системы авторизации (по умолчанию) используется asp.net identity
public class ApplicationUser : IdentityUser
{
public async Task
public class ApplicationUserManager : UserManager
public static ApplicationUserManager Create(
IdentityFactoryOptions
public class ApplicationSignInManager : SignInManager
public override Task
public static ApplicationSignInManager Create(
IdentityFactoryOptions
public class ApplicationDbContext : IdentityDbContext
static ApplicationDbContext()
{}
public static ApplicationDbContext Create()
{}
}
Указанные выше классы используются при настройки авторизации в приложении
public partial class Startup
{
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
}
}
Как в приведенном коде избавиться от сильной зависимости - app.CreatePerOwinContext()?
Ответ
Воспользуемся IoC контейнером Autofac для внедрения зависимостей.
При помощи менеджера пакетов Nuget установим необходимые пакеты:
Autofac
Autofac ASP.NET MVC 5 Integration
Autofac OWIN Integration
Внесем следующие изменения в класс Startup
private void ConfigureContainer(IAppBuilder app)
{
var builder = new ContainerBuilder();
// STANDARD MVC SETUP:
// Register your MVC controllers.
builder.RegisterControllers(typeof(MvcApplication).Assembly);
// Run other optional steps, like registering model binders,
// web abstractions, etc., then set the dependency resolver
// to be Autofac.
builder.RegisterType
builder.Register
var dataProtectionProvider = app.GetDataProtectionProvider();
builder.Register
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
// OWIN MVC SETUP:
// Register the Autofac middleware FIRST, then the Autofac MVC middleware.
app.UseAutofacMiddleware(container);
app.UseAutofacMvc();
}
private UserManager
// Configure validation logic for passwords
manager.PasswordValidator = new PasswordValidator
{
RequiredLength = 6,
RequireNonLetterOrDigit = true,
RequireDigit = true,
RequireLowercase = true,
RequireUppercase = true,
};
// Configure user lockout defaults
manager.UserLockoutEnabledByDefault = true;
manager.DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(5);
manager.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.
manager.RegisterTwoFactorProvider("Phone Code",
new PhoneNumberTokenProvider
//manager.EmailService = new EmailService();
//manager.SmsService = new SmsService();
if (dataProtectionProvider != null)
{
manager.UserTokenProvider = new DataProtectorTokenProvider
Добавим вызов метода ConfigureContainer(IAppBuilder app) в метод Configuration(IAppBuilder app)
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
ConfigureContainer(app);
}
}
После выше приведенных действий можно удалить методы app.CreatePerOwinContext() из метода ConfigureAuth()
так же необходимо модифицировать AccountControlle, ManageController
Убрать конструктор без параметров.
Удалить следующие свойства: UserManager, SignInManager, AuthenticationManager
Вот так может выглядеть AccountController после внесения необходимых изменений:
public class AccountController : Controller
{
private readonly IAuthenticationManager _authenticationManager;
private readonly SignInManager
public AccountController(
UserManager
Использованные источники информации:
Autofac’s documentation
Habrahabr
Комментариев нет:
Отправить комментарий