【问题标题】:Authenticate ASP.NET user session with javascript使用 javascript 验证 ASP.NET 用户会话
【发布时间】:2012-05-19 12:42:57
【问题描述】:

用于 ASP.NET MVC 3 网站用户管理的标准演示包括以下登录过程:

  1. 用户输入身份验证数据。
  2. 数据已发布到服务器。
  3. 处理身份验证尝试的代码检查所提供的 DB 数据。
  4. 如果一切正常 - 调用 FormsAuthentication.SetAuthCookie为来自浏览器的即将到来的会话请求设置 cookie。
  5. 并将用户重定向到任何地方。

我想实现一个纯粹的 jQuery.Ajax - ASP.NET 登录机制。

我可以毫无问题地从 js 调用 MVC 站点操作。但是我如何从 JS 代码中手动获取这个 FormsAuthentication.SetAuthCookie cookie 数据,将它们放入浏览器 cookie 存储中?如何在服务器或 jQuery.ajax 成功代码中提取它们?

【问题讨论】:

    标签: asp.net asp.net-mvc-3 jquery asp.net-authentication


    【解决方案1】:

    使用 MVC 3,您可以为登录按钮设置 onclick 事件,然后将 ajax POST 发送到登录操作。让登录操作返回 JSON 结果并控制从您的 javascript 函数发送用户的位置。

    [HttpPost]
    public JsonResult LogOn(LogOnModel model, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            //Do your authentication
            FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
            return Json(true);
        }
    
    // If we got this far, something failed, redisplay form
        return Json(false);
    }
    

    在您的视图中添加一个 Id 到您的表单并在按钮上放置一个点击处理程序。

    <% using (Html.BeginForm("LogOn", "Account", FormMethod.Post, new { Id = "frmLogOn" }))
       { %>
        <%: Html.ValidationSummary(true, "Login was unsuccessful. Please correct the errors and try again.")%>
        <div>
            <fieldset>
                <legend>Account Information</legend>
    
                <div class="editor-label">
                    <%: Html.LabelFor(m => m.UserName)%>
                </div>
                <div class="editor-field">
                    <%: Html.TextBoxFor(m => m.UserName)%>
                    <%: Html.ValidationMessageFor(m => m.UserName)%>
                </div>
    
                <div class="editor-label">
                    <%: Html.LabelFor(m => m.Password)%>
                </div>
                <div class="editor-field">
                    <%: Html.PasswordFor(m => m.Password)%>
                    <%: Html.ValidationMessageFor(m => m.Password)%>
                </div>
    
                <div class="editor-label">
                    <%: Html.CheckBoxFor(m => m.RememberMe)%>
                    <%: Html.LabelFor(m => m.RememberMe)%>
                </div>
    
                <p>
                    <input type="submit" value="Log On" onclick="clicked(); return false;" />
                </p>
            </fieldset>
        </div>
    <% } %>
    <script type="text/javascript">
        function clicked() {
            var form = $('#frmLogOn');
            $.ajax({
                type: 'POST',
                url: '/Account/LogOn',
                data: form.serializeObject(),
                success: function (result) {
                    if (result == true) {
                        alert("success");
                        window.top.location = "/Home/Index";
                    }
                    else {
                        alert("failure");
                    }
                },
                error: function (data) {
                    alert("error");
                }
            });
        }
    </script>
    

    【讨论】:

    • 在此示例中,身份验证 cookie 将在哪里设置?它们如何到达客户端浏览器并写入 cookie 存储?
    • LogOn 操作中对 FormsAuthentication.SetAuthCookie() 的调用将 POST 调用的响应中的 cookie 设置为 /Account/LogOn。该 cookie 将在客户端创建,如果您随后将用户的浏览器发送到需要授权的 URL,它将使用 cookie。
    • 我会检查它是否真的从 ajax 调用中读取了 cookie - 将标记为答案。谢谢。
    • 确实这就是它在 ASP.NET MVC 4 Beta 示例中的实现方式。
    【解决方案2】:

    安装 MVC4 测试版,默认的 Internet 模板提供了一种 Ajax 身份验证机制,您可以窃取该机制并将其放入您的 MVC3 应用程序中。

    或者只使用 MVC4,因为 MVC4 很可能会在接下来的几个月内发布。当前的 MVC4 测试版还有一个上线许可证,因此您甚至可以根据需要使用它。

    【讨论】:

    • 我现在会调查一下。为什么提到许可证?它与启动 MVC3 或 4 个网站有何关系?我在法律上是否被限制以任何方式使用它?
    • @MaximV.Pavlov - Microsoft 的大多数测试版都不允许您在生产网站中使用代码,除非您获得上线许可证。他们已经为 MVC4 测试版颁发了这样的许可证。
    【解决方案3】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-27
      • 2014-09-03
      • 1970-01-01
      • 1970-01-01
      • 2016-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多