.net core中登录认证---cookie+session认证

.net core中登录认证的几种方式

第一种、session\cookie+方法过滤器认证

1. 讲解:该认证模式主要的逻辑如下,并且分别在session和cookie中存储相应的值,并且在方法过滤器中进行进行拦截验证。

登录的逻辑应该是
session中存储用户的主要信息
    key:guid类型
    value: 用户的信息
cookie中存储服务端的session的数据类型
    key:CurrentUser  //这是一个固定的值
    value: session中的key的名字

2. 相关代码如下:

登录控制器

  //这是一个空过滤过滤器,表示该控制器里的都不进行过滤
    [CustomAllowAnonymous]
    public class SessionLoginController : Controller
    {
        [HttpGet]
        public IActionResult SessionLogins(int a)
        {
            if (a == 1)
            {
                #region Cookie/Session 自己写   一般使用Sessio为主
                CurrentUser currentUser = new CurrentUser()
                {
                    Id = 123,
                    Name = "wangjin",
                    Account = "Administrator",
                    Email = "1293604064",
                    Password = "123456",
                    LoginTime = DateTime.Now
                };
                //生成一个guid的值用来存储主键的值
                Guid sessionKey = Guid.NewGuid();
                //写Session/写Cookies 
                base.HttpContext.SetCookies("CurrentUser", sessionKey.ToString(), 30);
                //写入session
                base.HttpContext.Session.SetString(sessionKey.ToString(), Newtonsoft.Json.JsonConvert.SerializeObject(currentUser));
                #endregion
                return base.Redirect("/Home/Index");
            }
            return View();
        }
    }

方法过滤器

   /// <summary>
    /// 方法过滤器
    /// </summary>
    public class CustomActionFilterAttribute : Attribute, IActionFilter
    {
        /// <summary>
        /// 方法执行前
        /// </summary>
        /// <param name="context"></param>
        public void OnActionExecuting(ActionExecutingContext context)
        {
            //表示如果带有该属性,就不进行下面的步骤,直接返回
            if (context.ActionDescriptor.EndpointMetadata.Any(item => item.GetType() == typeof(CustomAllowAnonymousAttribute))) //如果标记的有特殊的记号,就避开检查;
            {
                return;
            }
            Byte[] bytes;
            context.HttpContext.Session.TryGetValue("CurrentUser", out bytes);
            string cookieKey = CookieSessionHelper.GetCookiesValue(context.HttpContext, "CurrentUser");
            string str = cookieKey != null ? new SessionHelper(context.HttpContext).GetSession(cookieKey) : null;
            if (string.IsNullOrEmpty(str))
            {
                var result = new ViewResult { ViewName = "~/Views/SessionLogin/SessionLogins.cshtml" };
                //result.ViewData = new ViewDataDictionary(_modelMetadataProvider, context.ModelState);
                //result.ViewData.Add("Exception", context.Exception);
                context.Result = result; //断路器---只要对Result赋值--就不继续往后了;

            }
            Console.WriteLine("这是方法执行前");
        }
        /// <summary>
        /// 方法执行后
        /// </summary>
        /// <param name="context"></param>
        public void OnActionExecuted(ActionExecutedContext context)
        {
            if (context.ActionDescriptor.EndpointMetadata.Any(item => item.GetType() == typeof(CustomAllowAnonymousAttribute))) //如果标记的有特殊的记号,就避开检查;
            {
                return;
            }
            Console.WriteLine("这是方法执行后");
        }
    }

空白过滤器,目的是为了跳过过滤器

public class CustomAllowAnonymousAttribute:Attribute
    {
    }

在ConfigureServices中添加如下:

services.AddSession();
            services.AddMvc(option =>
            {
                option.Filters.Add<CustomActionFilterAttribute>(); //全局注册:
                option.Filters.Add<CustomExceptionFilterAttribute>(); //全局注册异常过滤器:
            });

在Configure中添加如下:

        app.UseSession();
            app.UseCookiePolicy();

还有操作cookie封装的方法:

public static class CookieSessionHelper
    {
        public static void SetCookies(this HttpContext httpContext, string key, string value, int minutes = 30)
        {
            httpContext.Response.Cookies.Append(key, value, new CookieOptions
            {
                Expires = DateTime.Now.AddMinutes(minutes)
            });
        }
        public static void DeleteCookies(this HttpContext httpContext, string key)
        {
            httpContext.Response.Cookies.Delete(key);
        }

        public static string GetCookiesValue(this HttpContext httpContext, string key)
        {
            httpContext.Request.Cookies.TryGetValue(key, out string value);
            return value;
        }

        public static CurrentUser GetCurrentUserBySession(this HttpContext context)
        {
            string sUser = context.Session.GetString("CurrentUser");
            if (sUser == null)
            {
                return null;
            }
            else
            {
                CurrentUser currentUser = Newtonsoft.Json.JsonConvert.DeserializeObject<CurrentUser>(sUser);
                return currentUser;
            }
        }
    }

封装操作Session的

public class SessionHelper
    {
        private IHttpContextAccessor _accessor;

        private ISession _session;
        private IRequestCookieCollection _requestCookie;
        private IResponseCookies _responseCookie;
        public SessionHelper(HttpContext context)
        {
            _session = context.Session;
            _requestCookie = context.Request.Cookies;
            _responseCookie = context.Response.Cookies;
        }
        /// <summary>
        /// 设置session值
        /// </summary>
        /// <param name="session"></param>
        /// <param name="key"></param>
        /// <param name="value"></param>
        public void SetSession(string key, string value)
        {
            var bytes = System.Text.Encoding.UTF8.GetBytes(value);
            _session.Set(key, bytes);
        }
        /// <summary>
        /// 获取Session值
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public string GetSession(string key)
        {
            Byte[] bytes;
            _session.TryGetValue(key, out bytes);
            var value = System.Text.Encoding.UTF8.GetString(bytes);

            if (string.IsNullOrEmpty(value))
            {
                value = string.Empty;
            }
            return value;
        }
        ///// <summary>
        ///// 设置本地cookie
        ///// </summary>
        ///// <param name="key"></param>
        ///// <param name="value"></param>
        ///// <param name="minutes">过期时间</param>
        //public void SetCookies(string key,string value,int day = 1)
        //{
        //    _responseCookie.Append(key, value, new CookieOptions
        //    {
        //        Expires = DateTime.Now.AddDays(day)
        //    }) ;
        //}
        //public void  DeleteCookies(string key)
        //{
        //    _responseCookie.Delete(key);
        //}
        //public string GetCookiesValue(string key)
        //{
        //    _requestCookie.TryGetValue(key, out string value);
        //    if (string.IsNullOrEmpty(value))
        //    {
        //        value = string.Empty;
        //    }
        //    return value;
        //}
    }

 

感谢学习!!!

 

posted @ 2021-03-11 00:07  锦大大的博客呀!  阅读(878)  评论(0编辑  收藏  举报