Authorize的Forms认证

页面请求步骤:

1.登录地址: http://localhost:4441/SysLogin/AdminLogin

2.登陆成功地址:http://localhost:4441/Frame/MainFrame

3.点击页面退出,清除Session/Cookie跳转到登录页面

4.Url输入登录成功的地址界面自动验证授权进入:http://localhost:4441/SysLogin/AdminLogin?ReturnUrl=%2fFrame%2fMainFrame

代码实现步骤:

1.登录页面:SysLogin/AdminLogin,不继承BaseController

[HttpPost]
        [OperateLoggerFilter(IsRecordLog = false, ConName = "系统登录", ActName = "用户登录")]
        public ActionResult LoginAuthentica(string Account, string Pwd)
        {
            try
            {
                var Result = AdminServiceDb.GetEntityByWhere(it => it.Account == Account);
                if (Result == null)
                {
                    return Json(new { result = false, msg = "用户不存在" });
                }
                else
                {
                    Pwd = StringHelper.MD5(Pwd);
                    if (Result.PassWord != Pwd)
                    {
                        return Json(new { result = false, msg = "密码错误" });
                    }
                    DateTime overdueDate;
                    string value = Result.ID.ToString();
                    value = Encrypt.Encrypto(value);
                    overdueDate = DateTime.Now.AddMinutes(30);
                    FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
                                1,
                                Guid.NewGuid().ToString(),
                                DateTime.Now,
                                overdueDate,
                                false,
                                value
                                );
                    FormsAuthenticationTicket t = new FormsAuthenticationTicket(0, "", DateTime.Now, overdueDate, false, value);
                    string hashTicket = FormsAuthentication.Encrypt(ticket);
                    HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, hashTicket);
                    Response.Cookies.Add(cookie);
                    string url = Url.Action("MainFrame", "Frame");
                    return Json(new { result = true, msg = url });
                }
            }
            catch (Exception ex)
            {
                LogHelper.Error(this, ex);
                return Json(new { result = false, msg = "异常:登录失败" });
            }
        }

登录方法

2.登录成功后:Frame/MainFrame,继承BaseController

  [System.Web.Mvc.Authorize]//引用授权

    public class FrameController : BaseController
    {
        ......

3.WebConfig配置:

    <authentication mode="Forms">
      <forms loginUrl="~/SysLogin/AdminLogin" timeout="2880" />
    </authentication>

4.登录Controller的特性页面:

 public class OperateLoggerFilter : FilterAttribute, IActionFilter
    {

        private LogService logServiceDb = new LogService();

        /// <summary>
        /// 是否记录日志,默认为不记录
        /// </summary>
        public bool IsRecordLog = false;

        /// <summary>
        /// 控制器中文名
        /// </summary>
        public string ConName = string.Empty;

        /// <summary>
        /// 方法中文名
        /// </summary>
        public string ActName = string.Empty;

        /// <summary>
        /// 是否为form提交,若是则设置为true,否则报错,默认为false
        /// </summary>
        public bool IsFormPost = false;

        /// <summary>
        /// 如果是form提交(IsFormPost为true),则需要设置此字段,此字段代表请求方法的参数类型集合
        /// </summary>
        public Type[] Entitys = null;

        /// <summary>
        /// Action执行后
        /// </summary>
        void IActionFilter.OnActionExecuted(ActionExecutedContext filterContext)
        {

            if (!IsRecordLog)
                return;

            //var result = string.Empty;
            if (filterContext.Result is ViewResult)
                return;
            //result = ((System.Web.Mvc.JsonResult)filterContext.Result).Data.ToString();

            string controller = filterContext.Controller.ToString();

            string action = filterContext.ActionDescriptor.ActionName;

            Type type = Type.GetType(controller);
            ParameterInfo[] parasInfo = null;
            if (!IsFormPost)
                parasInfo = type.GetMethod(action).GetParameters();
            else
                parasInfo = type.GetMethod(action, Entitys).GetParameters();

            if (parasInfo == null || parasInfo.Length == 0)
                return;

            StringBuilder content = new StringBuilder();
            if (!IsFormPost)
                foreach (var item in parasInfo)
                {
                    content.Append(item.Name);
                    content.Append(":");
                    if (filterContext.HttpContext.Request[item.Name] == null)
                        content.Append("null");
                    else
                        content.Append(filterContext.HttpContext.Request[item.Name].ToString());
                    content.Append(";");
                }
            else
                foreach (var item in parasInfo)
                {
                    PropertyInfo[] fileds = Entitys[0].GetProperties();
                    foreach (var f in fileds)
                    {
                        if (filterContext.HttpContext.Request[f.Name] == null)
                            continue;
                        content.Append(f.Name);
                        content.Append(":");
                        content.Append(filterContext.HttpContext.Request[f.Name].ToString());
                        content.Append(";");
                    }

                }

            var user = filterContext.HttpContext.User.Identity.Name;

            //-------------
            string cookieName = FormsAuthentication.FormsCookieName;//从验证票据获取Cookie的名字。
            //取得Cookie.
            HttpCookie authCookie = filterContext.HttpContext.Request.Cookies[cookieName];
            if (null == authCookie)
                return;
            FormsAuthenticationTicket authTicket = null;
            //获取验证票据。
            authTicket = FormsAuthentication.Decrypt(authCookie.Value);
            if (authTicket == null)
                return;

            //验证票据的UserData中存放的是用户信息。
            //UserData本来存放用户自定义信息。
            string userData = authTicket.UserData;
            string userId = Foc_Sys_Public.Encrypt.Decrypto(userData);
            FormsIdentity id = new FormsIdentity(authTicket);
            //把生成的验证票信息和角色信息赋给当前用户.

            Guid uid;
            if (Guid.TryParse(userId, out uid))
            {
                var model = new LogEntity
                {
                    ID = Guid.NewGuid(),
                    UserID = uid,
                    Controller = ConName.Trim() == string.Empty ? controller : ConName.Trim(),
                    Action = ActName.Trim() == string.Empty ? action : ActName.Trim(),
                    Content = content.ToString().Length > 500 ? content.ToString().Substring(0, 500) : content.ToString(),
                    //OperateResult = result.Contains("True") ? true : false,
                    IsDel = false,
                    CreatTime = DateTime.Now,
                };

                logServiceDb.AddEntity(model);
            }
        }

        /// <summary>
        /// Action执行前
        /// </summary>
        void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
        {

        }
    }

5.BaseController页面:

  /// <summary>
    ///  基础控制器 所有控制器必须继承
    /// </summary>
    [System.Web.Mvc.Authorize]
    public class BaseController : Controller
    {

        protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            string IsAjax = Request.Headers["X-Requested-With"];
            if (string.IsNullOrEmpty(IsAjax))
            {
                if (!IsCheckJJurisdicti(filterContext))
                {
                    filterContext.Result = Redirect(Url.Action("Page503", "Frame"));
                }
            }
            base.OnActionExecuting(filterContext);
        }

        protected override void OnException(ExceptionContext filterContext)
        {
            if (!filterContext.ExceptionHandled)
            {
                filterContext.ExceptionHandled = true;
                LogHelper.Error(filterContext.Controller, filterContext.Exception);
            }
            filterContext.Result = Redirect(Url.Action("Page503", "Frame"));
            base.OnException(filterContext);
        }
}

BaseController页面

时间: 2024-11-05 02:41:38

Authorize的Forms认证的相关文章

asp.net权限认证:Forms认证

摘要: 明天就除夕了,闲着也是闲着,特地总结一些关于.net下的权限认证的方法. 一.Forms认证示意图 Forms认证即是表单认证,需提供身份id和密码password的进行认证和授权管理. 应该是大家比较熟悉的一种,刚接触.net可能都会学学这个东西. 下面看看他的工作方式: 二.看图太乏味,我准备了一个demo 因为默认首页为:IndexController/Index,这个页面只要一行字 “Index”, 效果图: OK,页面没有做任何权限控制,显示正常. 接下来看看DefaultCo

在asp.net WebAPI 中 使用Forms认证和ModelValidata(模型验证)

一.Forms认证 1.在webapi项目中启用Forms认证 Why:为什么要在WebAPI中使用Forms认证?因为其它项目使用的是Forms认证. What:什么是Forms认证?它在WebAPI中就是一个MessageHandle,具体请查找关键字“ASP.NET Forms” How:如何启动Forms认证? 最简单的是通过配置启动Forms认证: 1 <system.web> 2 <authentication mode="Forms"> 3 <

[Bug]IE11下,forms认证,出现无法保存cookie的问题

目录 ie11 解决方案 ie11 在ie11下,访问服务器上的网站地址,莫名其妙的多出一串东西,这一串字符串是由于客户端禁用cookie造成sessionid无法写入cookie,所以就拼在url上面了: http://192.168.80.90:8003/(F(f7MHPrEbtCN867LFxf9VSLQnzHRsU41jVEYkBT6WTAbyiBlFGeJrLDnvj7cI4M8fEUPPwoqLANdfLxb7ydCt6vOPDxh9rP2ssg9L7-xvSpaEV2pE6eIW9

【转】权限管理学习 一、ASP.NET FORMS身份认证

[转]权限管理学习 一.ASP.NET Forms身份认证 说明:本文示例使用的VS2017和MVC5.系统无论大小.牛逼或屌丝,一般都离不开注册.登录.那么接下来我们就来分析下用户身份认证. 简单实现登录.注销 以前在学习.net的时候不知道什么Forms身份认证,直接用session实现登录,效果也蛮好嘛.而且用户信息存在服务端,安全.前端代码: @if (string.IsNullOrWhiteSpace(ViewBag.UserName)) { <form action="/hom

权限管理学习 一、ASP.NET Forms身份认证

说明:本文示例使用的VS2017和MVC5.系统无论大小.牛逼或屌丝,一般都离不开注册.登录.那么接下来我们就来分析下用户身份认证. 简单实现登录.注销 以前在学习.net的时候不知道什么Forms身份认证,直接用session实现登录,效果也蛮好嘛.而且用户信息存在服务端,安全.前端代码: @if (string.IsNullOrWhiteSpace(ViewBag.UserName)) { <form action="/home/login1"> <input t

IE11下Forms身份认证无法保存Cookie的问题

ASP.NET中使用Forms身份认证常见的做法如下: 1. 网站根目录下的Web.config添加authentication节点 <authentication mode="Forms"> <forms name="MyAuth" loginUrl="manager/Login.aspx" defaultUrl="manager/default.aspx" protection="All&quo

细说ASP.NET Forms身份认证

用户登录是个很常见的业务需求,在ASP.NET中,这个过程被称为身份认证. 由于很常见,因此,我认为把这块内容整理出来,与大家分享应该是件有意义的事. 在开发ASP.NET项目中,我们最常用的是Forms认证,也叫[表单认证]. 这种认证方式既可以用于局域网环境,也可用于互联网环境,因此,它有着非常广泛的使用. 这篇博客主要讨论的话题是:ASP.NET Forms 身份认证. 有一点我要申明一下:在这篇博客中,不会涉及ASP.NET的登录系列控件以及membership的相关话题, 我只想用比较

IE11下ASP.NET Forms身份认证无法保存Cookie的问题

IE11下ASP.NET Forms身份认证无法保存Cookie的问题 折腾了三四天,今天才找到资料,解决了. 以下会转贴,还没来得及深究,先放着,有空再学习下. ASP.NET中使用Forms身份认证常见的做法如下: 1. 网站根目录下的Web.config添加authentication节点 <authentication mode="Forms"> <forms name="MyAuth" loginUrl="manager/Log

细说ASP.NET Forms身份认证 别人写的不过很透彻就转来了以后用时再看

阅读目录 开始 ASP.NET身份认证基础 ASP.NET身份认证过程 如何实现登录与注销 保护受限制的页面 登录页不能正常显示的问题 认识Forms身份认证 理解Forms身份认证 实现自定义的身份认证标识 在多台服务器之间使用Forms身份认证 在客户端程序中访问受限页面 用户登录是个很常见的业务需求,在ASP.NET中,这个过程被称为身份认证. 由于很常见,因此,我认为把这块内容整理出来,与大家分享应该是件有意义的事. 在开发ASP.NET项目中,我们最常用的是Forms认证,也叫[表单认