my colleague , myself working on application form login functionality user logs in mvc 4 app , there details submitted web api checked against values held in database once verified web api returns loginresult class contains error message (if any) , bool stating whether has been successful or not.
at mvc 4 application level code below used submit login details web api:
login action
[httppost] [validateantiforgerytoken] public async task<actionresult> login(accountviewmodel model) { if (!modelstate.isvalid) return view("login", model); await _client.postasjsonasync("api/applicant/checkapplicant", model) .continuewith((posttask) => posttask.result.ensuresuccessstatuscode()); var service = dependencyresolver.current.getservice<iapplyservice>(); var loginresult = service.getloginresult(); var loginsuccess = loginresult.loginsuccess; if (loginsuccess != null && (bool) loginsuccess) { formsauthentication.setauthcookie(model.email, model.rememberme); return redirecttoroute("terms , conditions"); } return view("login"); } the login details received @ web api in method:
check applicant method
public string checkapplicant(applicant applicant) { int32 passwordfailuretimeoutmins = convert.toint32(system.configuration.configurationsettings.appsettings["passwordfailuretimeoutmins"]); int32 passwordfailureattempts = convert.toint32(system.configuration.configurationsettings.appsettings["passwordfailureattempts"]); applicantrepository applicantrepository = new applicantrepository(); applicant applicantdb = applicantrepository.getbyid(applicant.email); loginresult loginresult = new loginresult(); passwordhelper passwordhelper = new passwordhelper(); if (applicantdb == null) { loginresult.loginsuccess = false; loginresult.loginerror = "your password or login may not correct."; } else { bool loginfailurecheck; if (applicantdb.loginfailurecount > passwordfailureattempts) { system.timespan diffresult = datetime.now.subtract(convert.todatetime(applicantdb.lastloginfailure)); if (diffresult.minutes < passwordfailuretimeoutmins) { loginfailurecheck = false; } else { loginfailurecheck = true; } } else { loginfailurecheck = true; } if (passwordhelper.checkpassword(applicant.password, applicantdb.password)) { if(loginfailurecheck) { if(applicantdb.accountactive) { loginresult.loginsuccess = true; loginresult.loginerror = "login successful."; applicantdb.lastloginfailure = null; applicantdb.lastloginsuccess = datetime.now; applicantdb.loginfailurecount = 0; applicantrepository.update(applicantdb); } else { loginresult.loginsuccess = false; loginresult.loginerror = "this account has been permanently banned."; } } else { loginresult.loginsuccess = false; loginresult.loginerror = "this account temporarily disabled please wait " + passwordfailuretimeoutmins + " minutes before trying again"; applicantdb.lastloginfailure = datetime.now; applicantdb.loginfailurecount = applicantdb.loginfailurecount + 1; applicantrepository.update(applicantdb); } } else { loginresult.loginsuccess = false; loginresult.loginerror = "your password or login may not correct."; applicantdb.lastloginfailure = datetime.now; applicantdb.loginfailurecount = applicantdb.loginfailurecount + 1; applicantrepository.update(applicantdb); } } return jsonconvert.serializeobject(loginresult); } as can see returns jsonconvert.serializeobject(loginresult).
when done process returns login actionresult above moves getloginresult() method shown below:
getloginresult
public loginresult getloginresult() { const string uri = "http://localhost:55830/api/applicant/checkapplicant"; using (var httpclient = new httpclient()) { var response = httpclient.getstringasync(uri); return jsonconvert.deserializeobject<loginresult>(response.result); } } when point returns error 405 method not allowed.
how consume loginresult @ mvc 4 app level , best way of sending loginresult web api?
any advice appreciated.
not sure trying making read result of previous post? can read response message of post result, this.
public async task<actionresult> login(accountviewmodel model) { if (!modelstate.isvalid) return view("login", model); var message = await _client.postasjsonasync ("api/applicant/checkapplicant", model); message.ensuresuccessstatuscode(); loginresult result = await message.content.readasasync<loginresult>(); // other stuff here } change web api action method return loginresult directly. framework serialize you.
public loginresult checkapplicant(applicant applicant) { }
Comments
Post a Comment