2013-07-19 63 views
0

我的同事和我正在使用登錄功能的應用程序表單,用戶從mvc 4應用程序登錄並將詳細信息提交到web api以進行檢查一旦證實web api返回一個包含錯誤信息(如果有的話)的loginResult類和一個用於說明它是否成功的bool,數據庫中保存的值。從web api返回登錄成功到mvc 4應用程序

在MVC 4應用程序級別下面的代碼是用於提交登錄信息到Web API:

登錄行動

[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 And Conditions"); 
     } 

     return View("Login"); 
    } 

的登錄信息,然後在Web API接收在這種方法:

檢查申請人方法

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 be 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 is now 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 be correct."; 
       applicantDB.LastLoginFailure = DateTime.Now; 
       applicantDB.LoginFailureCount = applicantDB.LoginFailureCount + 1; 
       applicantRepository.Update(applicantDB); 
      } 
     } 
     return JsonConvert.SerializeObject(loginResult); 
    } 

你可以看到它返回一個JsonConvert.SerializeObject(loginResult)。

當這樣做時,過程返回到登錄的ActionResult如上它然後,如下所示移動到GetLoginResult()方法:

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); 
     } 
    } 

,當它到達這個點它將返回一個不允許的錯誤405方法。

如何在mvc 4應用程序級別使用loginResult,以及從web api發送loginResult的最佳方式是什麼?

任何意見將不勝感激。

回答

0

不知道你到底想要做什麼,但你是否正在使用GET來讀取以前POST的結果?您可以閱讀POST的響應消息以獲得結果,如下所示。

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>(); 

    // do other stuff here 
} 

更改web API操作方法,直接返回LoginResult。該框架將爲您序列化。

public LoginResult CheckApplicant(Applicant applicant) 
{ 

} 
+0

正是我所需要的,感謝解決方案 – CryoFusion87

相關問題