Używam identyfikatora asp.net w moim projekcie i korzystam z frameworkmap jako struktury DI. Problem jest, gdy używam konstruktora wtrysku następnie ApplicationUserManager nie ustawił wszystkich jego członków, np TokenProvider ...Jak skonfigurować aplikację ASP.NET Identity ApplicationUserManager za pomocą struktury StructureMap
to moja klasa ApplicationUserManager:
public class ApplicationUserManager : UserManager<User, long>
{
public ApplicationUserManager(IUserStore<User, long> store)
: base(store)
{
}
public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
var manager = new ApplicationUserManager(new CustomUserStore(context.Get<InsuranceManagementContext>()));
// Configure the application user manager
manager.UserValidator = new UserValidator<User, long>(manager)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = false
};
manager.PasswordValidator = new PasswordValidator
{
RequireDigit = true,
RequiredLength = 8,
RequireLowercase = false,
RequireNonLetterOrDigit = true,
RequireUppercase = false
};
var dataProtectionProvider = options.DataProtectionProvider;
if (dataProtectionProvider != null)
{
manager.UserTokenProvider =
new DataProtectorTokenProvider<User, long>(dataProtectionProvider.Create("TEST"));
}
return manager;
}
}
to Startup.Auth klasa:
public partial class Startup
{
// For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864
public void ConfigureAuth(IAppBuilder app)
{
app.CreatePerOwinContext(InsuranceManagementContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
// Enable the application to use a cookie to store information for the signed in user
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
ExpireTimeSpan = TimeSpan.FromHours(2.0),
AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Active,
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
});
}
}
i jej mój AccountController:
public class AccountController : BaseController
{
private ApplicationUserManager _userManager;
public ApplicationUserManager UserManager
{
get
{
return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
private set
{
_userManager = value;
}
}
public AccountController(ApplicationUserManager userManager)
{
UserManager = userManager;
}
}
moje qu estion jest jak mogę skonfigurować mój ApplicationUserManager z structuremap? Jeżeli ustawić go jak poniżej kod działa, ale nie wiem, jest to dobre rozwiązanie, czy nie:
ObjectFactory.Initialize(x =>
{
...
x.For<ApplicationUserManager>().Use(() => HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>());
...
});
proszę schować mnie, czy istnieje lepsze rozwiązanie i jeśli jest ok to co jest najlepsze życie na to? HttpContextScope, Singleton, ...?
Właśnie napisałem bloga o kontenerach tożsamości i kontach DI: http://tech.trailmax.info/2014/09/aspnet-identity-and-ioc-container-registration/ to prawdopodobnie ci pomoże. – trailmax