• .net mvc结合微软提供的FormsAuthenticationTicket登陆


    一、Web.config

      <system.web>
        <compilation debug="true" targetFramework="4.5" />
        <httpRuntime targetFramework="4.5" />
        <authentication mode="Forms">
          <forms loginUrl="/Sign/SignIn" defaultUrl="/Home/Index" />
        </authentication>
      </system.web>
    View Code

    二、SignController(主要实现)

        /// <summary>
        /// 登陆、注销功能
        /// </summary>
        public class SignController : Controller
        {
            /// <summary>
            /// 登陆页面
            /// </summary>
            /// <returns></returns>
            [AllowAnonymous]
            public ActionResult SignIn()
            {
                var isAuthenticated = System.Web.HttpContext.Current.User.Identity.IsAuthenticated;
                if (isAuthenticated) //已经验证用户
                {
                    return Redirect(FormsAuthentication.DefaultUrl);
                }
                var reUrl = FormsAuthentication.GetRedirectUrl(HttpContext.User.Identity.Name, false);
                ViewBag.RedirectUrl = reUrl;
    
                return View();
            }
    
            /// <summary>
            /// 登陆功能
            /// </summary>
            /// <param name="userName">用户名</param>
            /// <param name="pwd">密码</param>
            /// <returns></returns>
            [HttpPost]
            [AllowAnonymous]
            public JsonResult LogIn(string userName, string pwd)
            {
                if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(pwd))
                {
                    var ticket = new FormsAuthenticationTicket(2, userName, DateTime.Now, DateTime.Now.AddMinutes(1), false, userName + pwd);
                    string hashTicket = FormsAuthentication.Encrypt(ticket);
                    var userCookie = new HttpCookie(FormsAuthentication.FormsCookieName, hashTicket);
                    HttpContext.Response.Cookies.Add(userCookie);        //添加cookies
    
                    var identity = new FormsIdentity(ticket);
                    HttpContext.User = new CustomPrincipal(identity);       //获取请求信息,通过自定义标志(重点)
    
                    return Json(1);
                }
                else
                    return Json(0);
            }
    
            /// <summary>
            /// 注销
            /// </summary>
            /// <returns></returns>
            [AllowAnonymous]
            public ActionResult SignOut()
            {
                FormsAuthentication.SignOut();
                return Redirect(FormsAuthentication.LoginUrl);
            }
        }
    View Code

    model

        /// <summary>
        /// 定义用户对象的基本功能(自定义)
        /// </summary>
        public class CustomPrincipal : IPrincipal
        {
            #region 字段
            private IIdentity _identity;
            #endregion
    
            #region 属性
            public IIdentity Identity
            {
                get { return _identity; }
            }
            #endregion
    
            #region 构造函数
            public CustomPrincipal(IIdentity identity)
            {
                _identity = identity;
            }
            #endregion
    
            #region 方法
            public bool IsInRole(string role)
            {
                throw new NotImplementedException();
            }
            #endregion
        }
    View Code

    view

    @{
        ViewBag.Title = "SignIn";
    }
    
    <h2>SignIn</h2>
    <a href="@Url.Action("Index", "Home")">主页</a>
    <a href="@Url.Action("SignIn", "Sign")"> 登陆</a>
    <a href="@Url.Action("SignOut", "Sign")"> 注销</a>
    <a href="@Url.Action("Detail", "Home")"> 详细</a>
    <h2>name:@HttpContext.Current.User.Identity.Name</h2>
    <br />
    <div>用户名:<input id="user_name" /></div>
    <div>密  码:<input id="user_pwd" /></div>
    <div><input id="btnSumbit" type="button" value="提交" /></div>
    <script src="~/Scripts/jquery-1.10.2.min.js"></script>
    <script>
        $(function () {
            $('#btnSumbit').click(function () {
                var data = {
                    userName: $('#user_name').val(),
                    pwd: $('#user_pwd').val()
                }
                $.post('@Url.Action("LogIn", "Sign")', data, function (result) {
                    if (result == 1)
                        location.href = '@ViewBag.RedirectUrl';
                    else
    
                        alert(result);
                });
            })
    
        })
    </script>
    View Code

    三、需要权限的控制器(调用方式)

        [Authorize]
        public class BaseController : Controller
        {
        }
    View Code
        public class HomeController : BaseController
        {
             /// <summary>
             /// 首页
             /// </summary>
             /// <returns></returns>
             public ActionResult Index()
             {
                 return View();
             }
       
            public ActionResult Detail()
            {
                var cidentity = (FormsIdentity)HttpContext.User.Identity;
                var data = cidentity.Ticket.UserData;//获取存储的 数据
                var name = HttpContext.User.Identity.Name;
                var dd = FormsAuthentication.FormsCookieName;
                return View();
            }
    
        }
    View Code
    @{
        ViewBag.Title = "Index";
    }
    
    <h2>Index</h2>
    <a href="@Url.Action("Index", "Home")">主页</a>
    <a href="@Url.Action("SignIn", "Sign")"> 登陆</a>
    <a href="@Url.Action("SignOut", "Sign")"> 注销</a>
    <a href="@Url.Action("Detail", "Home")"> 详细</a>
    <h2>name:@HttpContext.Current.User.Identity.Name</h2>
    View Code
    @{
        ViewBag.Title = "Detail";
    }
    
    <h2>Detail</h2>
    <a href="@Url.Action("Index", "Home")">主页</a>
    <a href="@Url.Action("SignIn", "Sign")"> 登陆</a>
    <a href="@Url.Action("SignOut", "Sign")"> 注销</a>
    <a href="@Url.Action("Detail", "Home")"> 详细</a>
    <h2>name:@HttpContext.Current.User.Identity.Name</h2>
    View Code
  • 相关阅读:
    L1-045 宇宙无敌大招呼 (5分)
    L1-044 稳赢 (15分)
    L1-043 阅览室 (20分)
    L1-042 日期格式化 (5分)
    L1-041 寻找250 (10分)
    L1-040 最佳情侣身高差 (10分)
    L1-039 古风排版 (20分)
    L1-038 新世界 (5分)
    L1-037 A除以B (10分)
    利用C一种最有效的文件存储方式——16bit有符号位2进制存储
  • 原文地址:https://www.cnblogs.com/liujinwu-11/p/4551647.html
Copyright © 2020-2023  润新知