Pin*_*ski 4 c# asp.net asp.net-mvc simple-injector asp.net-identity
因此,我一直在尝试设置 ASP.NET Identity 2.2.1,但一直遇到障碍。作为应该由框架自动生成的东西,配置起来确实很复杂。我想我已经快完成了,但在使用简单注入器设置 IoC 时仍然遇到问题。
我一直在阅读有关这些问题的其他 StackOverflow 问题和博客。其中大多数看起来已经过时了,因为它们处理的是 ASP.NET Identity 1.0。从 2.0 到 2.2.1 甚至有足够的变化,我遇到了一些过时解决方案的问题。或者这些解决方案涉及其他 IoC 框架,但我无法将它们转换为简单注入器。我使用过其他 IoC 框架,但我是简单注入器的新手。
更新- Ric .Net 在他的评论中的第一个链接非常有帮助。我已经重新格式化了我的工作以适应他的建议,我想我已经快完成了。但我仍然有一个问题。我已完成用下面的代码替换以前的代码。
1)我更新了ApplicationDbContext:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext(string connectionstring)
: base(connectionstring, throwIfV1Schema: false)
{
}
}
Run Code Online (Sandbox Code Playgroud)
2)我从ApplicationUserManager中删除了 Create() 方法,并将其移至一个初始化所有简单注入器代码的类中:
public static class SimpleInjectorInitializer
{
public static Container Initialize(IAppBuilder app)
{
var container = GetInitializeContainer(app);
container.Verify();
DependencyResolver.SetResolver(
new SimpleInjectorDependencyResolver(container));
return container;
}
public static Container GetInitializeContainer(
IAppBuilder app)
{
var container = new Container();
container.RegisterSingle<IAppBuilder>(app);
container.RegisterPerWebRequest<
ApplicationUserManager>();
container.RegisterPerWebRequest<ApplicationDbContext>(()
=> new ApplicationDbContext(
"Your constring goes here"));
container.RegisterPerWebRequest<IUserStore<
ApplicationUser>>(() =>
new UserStore<ApplicationUser>(
container.GetInstance<ApplicationDbContext>()));
container.RegisterInitializer<ApplicationUserManager>(
manager => InitializeUserManager(manager, app));
container.RegisterMvcControllers(
Assembly.GetExecutingAssembly());
return container;
}
private static void InitializeUserManager(
ApplicationUserManager manager, IAppBuilder app)
{
manager.UserValidator =
new UserValidator<ApplicationUser>(manager)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = true
};
//Configure validation logic for passwords
manager.PasswordValidator = new PasswordValidator()
{
RequiredLength = 6,
RequireNonLetterOrDigit = false,
RequireDigit = true,
RequireLowercase = true,
RequireUppercase = true,
};
var dataProtectionProvider =
app.GetDataProtectionProvider();
if (dataProtectionProvider != null)
{
manager.UserTokenProvider =
new DataProtectorTokenProvider<ApplicationUser>(
dataProtectionProvider.Create("ASP.NET Identity"));
}
}
}
Run Code Online (Sandbox Code Playgroud)
3)我更改了Startup.cs中的配置方法:
public void Configuration(IAppBuilder app)
{
var container = SimpleInjectorInitializer.Initialize(app);
ConfigureAuth(app, container);
}
Run Code Online (Sandbox Code Playgroud)
4) 我在Configure.Auth.cs中更新了ConfigureAuth :
public void ConfigureAuth(IAppBuilder app, Container container)
{
// Configure the db context and user manager to use a single instance per request
//app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext(container.GetInstance<ApplicationUserManager>);
// Rest of code here ...
Run Code Online (Sandbox Code Playgroud)
5)然后我从 AccountsController 中删除了默认构造函数和 UserManager 属性。
我现在遇到的问题是,从 ASP.NET Identity 2.0 开始,他们已将参数添加ISecureDataFormat<AuthenticationTicket> accessTokenFormat到 AccountsController 构造函数中。
public AccountController(ApplicationUserManager userManager,
ISecureDataFormat<AuthenticationTicket> accessTokenFormat)
Run Code Online (Sandbox Code Playgroud)
那么现在,如何ISecureDataFormat<AuthenticationTicket>在 Simple Injector 中添加 DI?
因此,在Ric .Net 的帮助(我在上面作为问题的一部分发布)和Lucas Teles 在另一个问题中的回答之间,我终于得到了答案。卢卡斯建议将这些行添加到我的简单注射器设置中:
container.Register<ISecureDataFormat<AuthenticationTicket>,
SecureDataFormat<AuthenticationTicket>>(Lifestyle.Scoped);
container.Register<ITextEncoder, Base64UrlTextEncoder>(Lifestyle.Scoped);
container.Register<IDataSerializer<AuthenticationTicket>, TicketSerializer>(
Lifestyle.Scoped);
container.Register<IDataProtector>(
() => new Microsoft.Owin.Security.DataProtection.DpapiDataProtectionProvider()
.Create("ASP.NET Identity"),
Lifestyle.Scoped);
Run Code Online (Sandbox Code Playgroud)
所以现在我的容器构建方法如下所示:
public static Container GetInitializeContainer(IAppBuilder app)
{
var container = new Container();
// IoC for ASP.NET Identity
container.RegisterSingleton<IAppBuilder>(app);
container.Register<ApplicationUserManager>(Lifestyle.Scoped);
container.Register<ApplicationDbContext>(
() => new ApplicationDbContext("Your constring goes here"),
Lifestyle.Scoped);
container.Register<IUserStore<ApplicationUser>>(
() => new UserStore<ApplicationUser>(
container.GetInstance<ApplicationDbContext>()),
Lifestyle.Scoped);
container.RegisterInitializer<ApplicationUserManager>(
manager => InitializeUserManager(manager, app));
// Setup for ISecureDataFormat
container.Register<ISecureDataFormat<AuthenticationTicket>,
SecureDataFormat<AuthenticationTicket>>(Lifestyle.Scoped);
container.Register<ITextEncoder, Base64UrlTextEncoder>(Lifestyle.Scoped);
container.Register<IDataSerializer<AuthenticationTicket>,
TicketSerializer>(Lifestyle.Scoped);
container.Register<IDataProtector>(
() => new Microsoft.Owin.Security.DataProtection.DpapiDataProtectionProvider()
.Create("ASP.NET Identity"),
Lifestyle.Scoped);
// Register all controllers
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
return container;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3309 次 |
| 最近记录: |