2013-07-19 47 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

相关问题