0

私の同僚と私は、ログイン機能を備えたアプリケーション フォームで作業しています。ユーザーは mvc 4 アプリからログインし、詳細が Web API に送信され、Web API が loginResult クラスを返すことが確認されると、データベースに保持されている値と照合されます。これには、エラー メッセージ (ある場合) と、成功したかどうかを示すブール値が含まれます。

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) を返します。

これが完了すると、プロセスは上記の Login 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 method not allowed が返されます。

MVC 4 アプリ レベルで loginResult を使用するにはどうすればよいですか? Web API から loginResult を送信する最良の方法は何ですか?

アドバイスをいただければ幸いです。

4

1 に答える 1