我正在为我的网络应用程序添加身份验证。它是一个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数据调用的浏览器中完全客户端这样做,这可能吗?能够在我的客户端代码中添加一个检查以查看用户是否经过身份验证,否则将它们扔到登录页面?
有什么想法吗?感谢。
答案 0 :(得分:1)
是的,MVC非常适合在Ajax上工作。
您可以修改控制器以返回JSON,并使用jquery ajax调用,您可以使用clienside javascript处理返回的json。
更改最后一行(返回视图(模型)),使其类似于以下内容
return Json(new {IsSuccess=successVariable, RedirectUrl=myRedirectUrl, Message=failedErrorMessage});
调整重定向行,改为设置myRedirectUrl变量。
<强>更新强>
如果您想在项目中摆脱MVC(因为这对于这么简单的任务来说太过分了),请在您的站点上添加一个Web服务(asmx)。在里面创建一个类似于以下的web方法:
[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};
}
答案 1 :(得分:0)
您也可以从客户端执行此操作......但如果您的应用程序需要完全安全性,那么此模型将打开许多安全循环漏洞。
答案 2 :(得分: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";