.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; //} }
感谢学习!!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2019-03-11 confirm("确定要删除吗?") _详解