Asp.net mvc 4 将登录成功从web api返回到mvc 4应用程序

Asp.net mvc 4 将登录成功从web api返回到mvc 4应用程序,asp.net-mvc-4,login,asp.net-web-api,Asp.net Mvc 4,Login,Asp.net Web Api,我的同事和我正在编写一份具有登录功能的申请表,用户从mvc 4应用程序登录,并将详细信息提交给web api,以便在验证web api返回包含错误消息(如果有)的loginResult类后,对照数据库中保存的值进行检查还有一本书,用来说明它是否成功 在mvc 4应用程序级别,以下代码用于向web api提交登录详细信息: 登录操作 [HttpPost] [ValidateAntiForgeryToken] public async Task<ActionResult>

我的同事和我正在编写一份具有登录功能的申请表,用户从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");
    }
[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务登录(AccountViewModel)
{
如果(!ModelState.IsValid)返回视图(“登录”,模型);
等待_client.postsjsonasync(“api/applicator/checkapplicator”,型号)
.ContinueWith((postTask)=>postTask.Result.EnsureSuccessStatusCode());
var service=DependencyResolver.Current.GetService();
var loginResult=service.GetLoginResult();
var loginsucess=loginResult.loginsucess;
if(loginsucess!=null&(bool)loginsucess)
{
FormsAuthentication.SetAuthCookie(model.Email,model.RememberMe);
返回重定向路由(“条款和条件”);
}
返回视图(“登录”);
}
然后通过以下方法在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);
    }
公共字符串检查申请人(申请人)
{
Int32 passwordFailureTimeoutMins=Convert.ToInt32(System.Configuration.ConfigurationSettings.AppSettings[“passwordFailureTimeoutMins”]);
Int32 passwordFailureAttempts=Convert.ToInt32(System.Configuration.ConfigurationSettings.AppSettings[“passwordFailureAttempts]”);
AppliantRepository AppliantRepository=新的AppliantRepository();
申请人applicationdb=applicationrepository.GetById(application.Email);
LoginResult LoginResult=新的LoginResult();
PasswordHelper PasswordHelper=新的PasswordHelper();
if(applicationDB==null)
{
loginResult.LoginSuccess=false;
loginResult.LoginError=“您的密码或登录可能不正确。”;
}
其他的
{                 
bool登录失败检查;
if(applicationDB.LoginFailureCount>passwordFailureAttempts)
{
System.TimeSpan Diffredesult=DateTime.Now.Subtract(Convert.ToDateTime(applicationDB.LastLoginFailure));
if(衍射结果分钟<密码失败超时分钟)
{
loginFailureCheck=false;
}
其他的
{
loginFailureCheck=true;
}
}
其他的
{
loginFailureCheck=true;
}
if(passwordHelper.CheckPassword(applicator.Password,applicationdb.Password))
{
如果(登录失败检查)
{
如果(应用数据库帐户活动)
{                        
loginResult.LoginSuccess=true;
loginResult.LoginError=“登录成功。”;
applicationdb.LastLoginFailure=null;
applicationdb.lastloginsucess=DateTime.Now;
applicationDB.LoginFailureCount=0;
applicationrepository.Update(applicationdb);
}
其他的
{
loginResult.LoginSuccess=false;
loginResult.LoginError=“此帐户已被永久禁止。”;
}
}
其他的
{
loginResult.LoginSuccess=false;
loginResult.LoginError=“此帐户现在暂时被禁用,请等待”+passwordFailureTimeoutMins+“分钟后重试”;
applicationdb.LastLoginFailure=DateTime.Now;
AppliantDB.LoginFailureCount=AppliantDB.LoginFailureCount+1;
applicationrepository.Update(applicationdb);
}
}
其他的
{
loginResult.LoginSuccess=false;
loginResult.LoginError=“您的密码或登录可能不正确。”;
applicationdb.LastLoginFailure=DateTime.Now;
AppliantDB.LoginFailureCount=AppliantDB.LoginFailureCount+1;
applicationrepository.Update(applicationdb);
}
}
返回JsonConvert.SerializeObject(loginResult);
}
正如您所看到的,它返回一个JsonConvert.SerializeObject(loginResult)

完成此操作后,流程返回到上面的登录操作结果,然后移动到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);
        }
    }
public LoginResult GetLoginResult()
{
常量字符串uri=”http://localhost:55830/api/Applicant/CheckApplicant";
使用(var httpClient=new httpClient())
{
var response=httpClient.GetStringAsync(uri);
返回JsonConvert.DeserializeObject(response.Result);
}
}
当它到达这一点时,它返回一个错误405方法not allowed

如何在MVC4应用程序级别使用loginResult,从web api发送loginResult的最佳方式是什么


如果您有任何建议,我们将不胜感激。

不确定您到底想做什么,但您是否正在阅读上一篇文章的结果?您可以阅读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
}
public LoginResult CheckApplicant(Applicant applicant)
{

}