0

我正在向我的 Web 应用程序添加身份验证。它是一个 asp.net mvc 单页应用程序。当前,Web 应用程序仅将 asp.net mvc 用于一件事,即身份验证。我检查 AppController 中的 Request.IsAuthenticated,如果它没有经过身份验证,则我提供登录页面(否则我保存 app.html 页面)。在我的 AccountController 中,我有以下登录操作:

[HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult LogOn(LogOnModel model, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            //VALIDATE USER NAME AND PASSWORD                
            if (Repository_Security.CheckUser(model.UserName, model.Password))
            {
                FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/") && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\\\"))
                {
                    return Redirect(returnUrl);
                }
                else
                {
                    return RedirectToAction("Index", "App");
                }
            }
            else
            {
                ModelState.AddModelError("", "The user name or password provided is incorrect.");
            }
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }

实际上,它只是获取用户名和密码并针对数据库进行验证。如果通过,则设置 AuthCookie。

我的问题是,如果我在浏览器中以 javascript 和 ajax 数据调用完全在客户端执行此操作,这可能吗?比能够在我的客户端代码中添加检查以查看用户是否经过身份验证,否则将它们扔到登录页面?

有任何想法吗?谢谢。

4

3 回答 3

1

是的,MVC 非常适合工作客户端 Ajax。

您可以修改控制器以返回 JSON,并且通过 jquery ajax 调用,您可以使用客户端 javascript 处理返回的 json。

将最后一行(返回 View(model))更改为如下所示

return Json(new {IsSuccess=successVariable, RedirectUrl=myRedirectUrl, Message=failedErrorMessage});

调整您的重定向行以设置 myRedirectUrl 变量。

更新

如果你想在你的项目中摆脱 MVC(因为它对于这样一个简单的任务来说有点过头了),向你的站点添加一个 Web 服务 (asmx)。在里面创建一个类似于以下的 webmethod:

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public LogonResponse Logon(LogonModel model){
    ... do login logic as your original code...
    return new LogonResponse() { IsSuccess = successVar, RedirectUrl=myRedirectUrl, Message=failedErrorMsg};
}
于 2012-10-28T21:04:33.430 回答
0

当您调用FormsAuthentication.SetAuthCookie()它时,它会将Set-Cookie标头发送回客户端,以便他们的浏览器可以存储身份验证 cookie。您可以使用 JavaScript 检查此 cookie 客户端是否存在。如果存在则继续,如果不存在则重定向(window.location.href)到登录页面,例如:

if (document.cookie.indexOf(".ASPXAUTH") >= 0) alert("You are logged in");
else window.location.href = "http://www.domain.com/login";
于 2012-10-28T22:06:13.490 回答
0

您也可以从客户端执行此操作...但是如果您的应用程序需要完全安全,那么此模型将打开许多安全漏洞。

于 2012-10-28T21:08:36.813 回答