.net - Injecting SignInManager dependency: does not work with Unity, works when using OWIN -


i adding asp.net identity authentication functionality asp.net mvc 5 web application.

i using unity dependency injection across project, decided inject dependencies required accountcontroller in constructor:

public accountcontroller(usermanager<applicationuser> usermanager, signinmanager<applicationuser, string> signinmanager) {     _usermanager = usermanager;     _signinmanager = signinmanager; } 

my login method implemented following (actually, copied code asp.net web application project template individual user accounts authentication):

// // post: /account/login [httppost] [allowanonymous] [validateantiforgerytoken] public async task<actionresult> login(loginviewmodel model, string returnurl) {     var result = await _signinmanager.passwordsigninasync(model.email, model.password, model.rememberme, shouldlockout: true);     // process result , return appropriate view...     // however, there no authentication cookies in response! } 

the problem authentication not work correctly - if entered correct credentials , result signinstatus.success, there no authentication cookies being sent in response.

however, if use owin infrastructure resolve applicationsigninmanager instead of unity container, works correctly:

// // post: /account/login [httppost] [allowanonymous] [validateantiforgerytoken] public async task<actionresult> login(loginviewmodel model, string returnurl) {     var owinsigninmanager = httpcontext.getowincontext().get<applicationsigninmanager>();     var result = await owinsigninmanager.passwordsigninasync(model.email, model.password, model.rememberme, shouldlockout: true);     // process result , return appropriate view...     // authentication cookies present in response! } 

that's how applicationsigninmanager registered in application startup class:

app.createperowincontext<applicationsigninmanager>(applicationsigninmanager.create); 

and applicationsigninmanager declaration:

public class applicationsigninmanager : signinmanager<applicationuser, string> {     public applicationsigninmanager(applicationusermanager usermanager, iauthenticationmanager authenticationmanager)         : base(usermanager, authenticationmanager)     {     }      public static applicationsigninmanager create(identityfactoryoptions<applicationsigninmanager> options, iowincontext context)     {         var usermanager = new applicationusermanager(new userstore<applicationuser>(new databasecontext()));         return new applicationsigninmanager(usermanager, context.authentication);     } } 

here's part of unity configuration:

unitycontainer.registertype<httpcontextbase>(new injectionfactory(c => new httpcontextwrapper(httpcontext.current))); unitycontainer.registertype<iowincontext>(new injectionfactory(c => c.resolve<httpcontextbase>().getowincontext())); unitycontainer.registertype<iauthenticationmanager>(new injectionfactory(c => c.resolve<iowincontext>().authentication)); 

the idea unity provides same dependencies applicationsigninmanager constructor create method does. unity's approach not work reason: no authentication cookies being sent after successful log in.

this specific question, maybe faced problem before? believe behavior should related owin middleware, pipeline , how stuff being wired @ application startup.

instead of registering iowincontext in container, register iauthenticationmanager:

container.registertype<iauthenticationmanager>(                 new injectionfactory(c => httpcontext.current.getowincontext().authentication)); 

and have 1 constructor signinmanager:

public applicationsigninmanager(applicationusermanager usermanager, iauthenticationmanager authenticationmanager) 

i have done registration unity like this, , here the explanation.


Comments

Popular posts from this blog

c++ - QTextObjectInterface with Qml TextEdit (QQuickTextEdit) -

javascript - angular ng-required radio button not toggling required off in firefox 33, OK in chrome -

xcode - Swift Playground - Files are not readable -