ASP.NET MVC 使用Jquery Ajax实现登录

视图[Views]  --   Login.cshtml 页面





    Ajax Login
    


    
@*生成防伪标记*@ @Html.AntiForgeryToken()



控制器 [Controller] -- AccountController

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Web.Helpers;
using System.Web.Mvc;
using MvcAjaxDemo.Models;

namespace MvcAjaxDemo.Controllers
{
    public class AccountController : Controller
    {
        //
        // GET: /Account/Login
        public ActionResult Login()
        {
            ViewBag.UserName = Retrieve("UserName");

            return View();
        }

        [HttpPost]
        [ExtendedValidateAntiForgeryToken]
        public ActionResult Login(LoginInfo model)
        {
            //是否为Ajax请求
            if (!Request.IsAjaxRequest())
                return View();
            if (model.UserName == null)
                return Json(GetResult(false, "用户名为空!", null));
            //根据用户名获取用户
            var user = UserService.GetUsers().SingleOrDefault(p => p.LoginName == model.UserName);

            if (user == null)
                return Json(GetResult(false, "用户名或密码错误!", null));
            //验证密码
            if (user.Password != model.Password)
                return Json(GetResult(false, "用户名或密码错误!", null));

            if (!string.IsNullOrWhiteSpace(model.RememberMe))
            {
                //保存帐户登录名
                Save("UserName", model.UserName, DateTime.Now.AddDays(2));
            }

            return Json(GetResult(false, "登录成功!", null));

        }

        #region 辅助方法
        /// 
        /// 获取结果集
        /// 
        /// 状态
        /// 提示信息
        /// 数据集
        /// 
        public static object GetResult(bool rel, string msg, object data)
        {
            return new Dictionary { { "rel", rel }, { "msg", msg }, { "obj", data } };
        }

        /// 
        /// 保存Cookie
        /// 
        /// 键
        /// 值
        /// 过期时间
        public void Save(string key, string value, DateTime expires)
        {
            var httpCookie = System.Web.HttpContext.Current.Response.Cookies[key];
            if (httpCookie == null) return;
            httpCookie.Value = value;
            httpCookie.Expires = expires;
        }
        /// 
        /// 检索Cookie
        /// 
        /// 键
        /// 
        public string Retrieve(string key)
        {
            var cookie = System.Web.HttpContext.Current.Request.Cookies[key];
            return cookie != null ? cookie.Value : "";
        }
        #endregion
    }


    #region 防止CSRF攻击特性
    /// 
    /// 防止CSRF攻击特性
    /// 
    public class ExtendedValidateAntiForgeryToken : AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            var request = filterContext.HttpContext.Request;
            if (request.HttpMethod != WebRequestMethods.Http.Post) return;
            if (request.IsAjaxRequest())
            {
                var antiForgeryCookie = request.Cookies[AntiForgeryConfig.CookieName];
                var cookieValue = antiForgeryCookie != null ? antiForgeryCookie.Value : null;
                //从cookies 和 Headers 中 验证防伪标记
                //这里可以加try-catch
                AntiForgery.Validate(cookieValue, request.Headers["__RequestVerificationToken"]);
            }
            else
            {
                new ValidateAntiForgeryTokenAttribute().OnAuthorization(filterContext);
            }
        }
    }
    #endregion

    //Model
    public class User
    {
        public int Id { get; set; }
        public string LoginName { get; set; }
        public string Password { get; set; }
    }
    

    public class UserService
    {
        public static IList GetUsers()
        {
            return new List
            {
                new User
                {
                    Id=1,
                    LoginName = "admin",
                    Password = "admin1234"
                },
                new User
                {
                    Id=2,
                    LoginName = "demo",
                    Password = "demo1234"
                },
                new User
                {
                    Id=3,
                    LoginName = "test",
                    Password = "test1234"
                },
            };
        }
    }
}


 
  

 
  

//模型[Models] -- LoginInfo.cs

namespace MvcAjaxDemo.Models
{
    public class LoginInfo
    {
        /// 
        /// 用户名
        /// 
        public string UserName { get; set; }
        /// 
        /// 密码
        /// 
        public string Password { get; set; }
        /// 
        /// 记住我?
        /// 
        public string RememberMe { get; set; }
    }
}


效果图:



Demo 下载地址

http://yunpan.cn/c3bQqR9NzsH8Q  访问密码 6683


有疑问的可以给我留言哦。

你可能感兴趣的:(asp.net,mvc,Ajax)