c# - Authentication state in ASP.NET MVC ActionFilters -


i have actionfilter name of log log user ip , other details when user login website work write following code:

public class log : actionfilterattribute {     public iappusermanager usermanager { get; set; }      public override void onresultexecuted(resultexecutedcontext filtercontext)     {         var status = filtercontext.controller.tempdata.any(pair => pair.key == "status" && (int)pair.value == 200);          if (filtercontext.httpcontext.user != null && filtercontext.httpcontext.user.identity.isauthenticated && status)         {             var logip = new addipaddressdto()             {                 browser = filtercontext.httpcontext.request.getbrowser(),                 ip = filtercontext.httpcontext.request.getip(),                 os = filtercontext.httpcontext.request.useragent.getos(),                 urlreferrer = filtercontext.httpcontext.request.urlreferrer?.tostring(),                 userid = guid.parse(filtercontext.httpcontext.user.identity.getuserid()),                 username = filtercontext.httpcontext.user.identity.getusername(),             };             usermanager.log(logip);         }         base.onresultexecuted(filtercontext);     } } 

this code work when filtercontext.httpcontext.user.identity.isauthenticated ture.

the log filter declare on login action:

[allowanonymous] [route("sign-in", name = "signinroute")] [httppost, validateantiforgerytoken] [log] public virtual async task<actionresult> login(logindto login, string returnto) {      var signinstatus = await _signinmanager          .passwordsigninasync(user.username, login.password, login.rememberme, true)             .configureawait(false);       switch (signinstatus) // success      {          case signinstatus.success:               tempdata["status"] = 200;               return redirecttolocal(returnto);          case signinstatus.lockedout:                 // todo return time of louckout               break;          case signinstatus.requiresverification:               return redirecttoaction("confirmemail");          case signinstatus.failure:               return view(cleanpasswordinlogin(login));             default:                 throw new argumentoutofrangeexception();      } } 

login action works fine , signinstatus success after excuted action isauthenticated false.

to solve issue i've tried following items:

  • used httpcontext.current.getowincontext();
  • defined following code in ioc (structuremap 4.5.2)

    config.for<httpcontextbase>().use(() => new httpcontextwrapper(httpcontext.current));

  • tried onactionexecuted,onactionexecuting,onresultexecuting

  • used iauthenticationmanager in identity 2.0

how can solve issue?

after execution of signinmanager.passwordsigninasync, authentication cookie created includes user info. user.identity info filled claims authentication cookie, not parsed yet (this cookie parsed in second request server, not in same login request). that's why can't use user.identity after passwordsigninasync. @ specific point, have 1 option find userid:

 string userid = usermanager.findbyname(model.email)?.id; 

Comments

Popular posts from this blog

ubuntu - PHP script to find files of certain extensions in a directory, returns populated array when run in browser, but empty array when run from terminal -

php - How can i create a user dashboard -

javascript - How to detect toggling of the fullscreen-toolbar in jQuery Mobile? -