Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
html/Javascript客户端用户登录_Javascript_Html_Asp.net Mvc_Authentication_Asp.net Authentication - Fatal编程技术网

html/Javascript客户端用户登录

html/Javascript客户端用户登录,javascript,html,asp.net-mvc,authentication,asp.net-authentication,Javascript,Html,Asp.net Mvc,Authentication,Asp.net Authentication,我正在向web应用程序添加身份验证。它是一个asp.net mvc单页应用程序。目前,web应用程序使用asp.net mvc仅用于一件事,即身份验证。我在AppController中检查Request.IsAuthenticated,如果它没有经过身份验证,那么我会提供登录页面(否则我会保存app.html页面)。在我的AccountController中,我有以下登录操作: [HttpPost] [AllowAnonymous] [ValidateAntiForgeryTok

我正在向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数据调用完全在客户端完成这项工作,这是否可能?而不是能够在我的客户端代码中添加一个检查,以查看用户是否经过身份验证,否则会将他们扔到登录页面


有什么想法吗?谢谢。

是的,MVC非常适合用于客户端Ajax

您可以修改控制器以返回JSON,通过jquery ajax调用,您可以使用clienside javascript处理返回的JSON

将最后一行(返回视图(模型))更改为如下所示

return Json(new {IsSuccess=successVariable, RedirectUrl=myRedirectUrl, Message=failedErrorMessage});
调整重定向行以改为设置myRedirectUrl变量

更新

如果你想在你的项目中摆脱MVC(因为对于这样一个简单的任务来说,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};
}

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

当您调用
FormsAuthentication.SetAuthCookie()
时,它会将
设置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";

我想我希望它独立于MVC。只希望能够使用登录详细信息调用web服务,并返回true false和其他身份验证详细信息。所以,如果需要,我可以把它从asp.NETMVC中删除而不出问题。嗨,Mac,谢谢你的回复。我想我更感兴趣的是客户端cookie(我已经在推拉数据了)。i、 e.将用户身份验证存储在浏览器中,并能够在页面更改时进行检查(也可以在用户关闭浏览器并返回以检查是否应再次登录或使用旧凭据时进行检查)。我认为您不完全了解安全模型在.NET中的工作原理。当用户访问您的站点时,他们会收到一个会话票证,它存储在HTTP头中。与此票证关联的服务器端会话已建立,其中包括跟踪用户是否登录。标题由用户的浏览器自动发送。一旦调用SetAuthCookie方法,就会将用户的会话绑定到服务器上的身份验证(直到会话过期)。然后,您的服务器代码将自动阻止未向匿名用户公开的任何请求。我现在的过程是将我的web应用程序和数据层分为两个独立的项目(这是因为客户端不一定是web应用程序,例如,它可能是ios应用程序)。数据层将通过webapi向客户端应用程序提供所有数据。我想从你的回答中我有一个问题。在我的web应用程序中,数据层位于一个单独的实体中,是否仍然可以执行所有登录身份验证?因此,基本上web应用程序将通过向webapi服务发送调用来根据数据库验证登录信息。请记住,您永远不应该依靠UI来强制执行安全性。这就是您的服务层作业(webapi)。UI可以调用webapi进行身份验证,并在身份验证成功后获得响应。若成功,您可以更新UI元素以反映其本身,但若服务器认为请求未经授权,客户端必须做好准备以正常方式失败(由于会话超时或类似事件,可能在任何时候发生)。