一.Cookie是什么?

  我的朋友问我cookie是什么,用来干什么的,可是我居然无法清楚明白简短地向其阐述cookie,这不禁让我陷入了沉思:为什么我无法解释清楚,我对学习的方法产生了怀疑!所以我们在学习一个东西的时候,一定要做到知其然知其所以然。

  HTTP协议本身是无状态的。什么是无状态呢,即服务器无法判断用户身份。Cookie实际上是一小段的文本信息)。客户端向服务器发起请求,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。

  打个比方,这就犹如你办理了银行卡,下次你去银行办业务,直接拿银行卡就行,不需要身份证。

二.在.NET Core中尝试

  废话不多说,干就完了,现在我们创建ASP.NET Core MVC项目,撰写该文章时使用的.NET Core SDK 3.0 构建的项目,创建完毕之后我们无需安装任何包,

  但是我们需要在Startup中添加一些配置,用于Cookie相关的。

//public const string CookieScheme = "YourSchemeName";public Startup(IConfiguration configuration)        {            Configuration = configuration;        }public IConfiguration Configuration { get; }// This method gets called by the runtime. Use this method to add services to the container.public void ConfigureServices(IServiceCollection services)        {//CookieAuthenticationDefaults.AuthenticationScheme Cookies Default Value//you can change scheme            services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)                .AddCookie(options => {                    options.LoginPath = "/LoginOrSignOut/Index/";                });            services.AddControllersWithViews();// is able to also use other services.//services.AddSingleton, ConfigureMyCookie>();        }

在其中我们配置登录页面,其中 AddAuthentication 中是我们的方案名称,这个是做什么的呢?很多小伙伴都懵懵懂懂表示很懵逼啊,我看很多人也是都写得默认,那它到底有啥用,经过我看AspNetCore源码发现它这个是可以做一些配置的。看下面的代码:

internal class ConfigureMyCookie : IConfigureNamedOptions    {// You can inject services herepublic ConfigureMyCookie()        {}public void Configure(string name, CookieAuthenticationOptions options)        {// Only configure the schemes you want//if (name == Startup.CookieScheme)//{// options.LoginPath = "/someotherpath";//}        }public void Configure(CookieAuthenticationOptions options)=> Configure(Options.DefaultName, options);    }

在其中你可以定义某些策略,随后你直接改变 CookieScheme 的变量就可以替换某些配置,在配置中一共有这几项,这无疑是帮助我们快速使用Cookie的好帮手~点个赞。

在源码中可以看到Cookie默认保存的时间是14天,这个时间我们可以去选择,支持TimeSpan的那些类型。

public CookieAuthenticationOptions()        {            ExpireTimeSpan = TimeSpan.FromDays(14);            ReturnUrlParameter = CookieAuthenticationDefaults.ReturnUrlParameter;            SlidingExpiration = true;            Events = new CookieAuthenticationEvents();        }

接下来LoginOrOut Controller,我们模拟了登录和退出,通过 SignInAsync 和 SignOutAsync 方法。

[HttpPost]public async Task Login(LoginModel loginModel)        {if (loginModel.Username == "haozi zhang" &&                loginModel.Password == "123456")            {var claims = new List                 {new Claim(ClaimTypes.Name, loginModel.Username)                 };                ClaimsPrincipal principal = new ClaimsPrincipal(new ClaimsIdentity(claims, "login"));await HttpContext.SignInAsync(principal);//Just redirect to our index after logging in.return Redirect("/Home/Index");            }return View("Index");        }/// /// this action for web lagout///         [HttpGet]public IActionResult Logout()        {            Task.Run(async () =>            {//注销登录的用户,相当于ASP.NET中的FormsAuthentication.SignOutawait HttpContext.SignOutAsync();            }).Wait();return View();        }

就拿出推出的源码来看,其中获取了Handler的某些信息,随后将它转换为 IAuthenticationSignOutHandler 接口类型,这个接口 as 接口,像是在地方实现了这个接口,然后将某些运行时的值引用传递到该接口上。

public virtual async Task SignOutAsync(HttpContext context, string scheme, AuthenticationProperties properties)        {if (scheme == null)            {var defaultScheme = await Schemes.GetDefaultSignOutSchemeAsync();                scheme = defaultScheme?.Name;if (scheme == null)                {throw new InvalidOperationException($"No authenticationScheme was specified, and there was no DefaultSignOutScheme found. The default schemes can be set using either AddAuthentication(string defaultScheme) or AddAuthentication(Action configureOptions).");                }            }var handler = await Handlers.GetHandlerAsync(context, scheme);if (handler == null)            {throw await CreateMissingSignOutHandlerException(scheme);            }var signOutHandler = handler as IAuthenticationSignOutHandler;if (signOutHandler == null)            {throw await CreateMismatchedSignOutHandlerException(scheme, handler);            }await signOutHandler.SignOutAsync(properties);        }

其中 GetHandlerAsync 中根据认证策略创建了某些实例,这里不再多说,因为源码深不见底,我也说不太清楚...只是想表达一下看源码的好处和坏处....

public async Task GetHandlerAsync(HttpContext context, string authenticationScheme)        {if (_handlerMap.ContainsKey(authenticationScheme))            {return _handlerMap[authenticationScheme];            }var scheme = await Schemes.GetSchemeAsync(authenticationScheme);if (scheme == null)            {return null;            }var handler = (context.RequestServices.GetService(scheme.HandlerType) ??                ActivatorUtilities.CreateInstance(context.RequestServices, scheme.HandlerType))as IAuthenticationHandler;if (handler != null)            {await handler.InitializeAsync(scheme, context);                _handlerMap[authenticationScheme] = handler;            }return handler;        }

最后我们在页面上想要获取登录的信息,可以通过 HttpContext.User.Claims 中的签名信息获取。

@using Microsoft.AspNetCore.Authentication

HttpContext.User.Claims

@foreach (var claim inUser.Claims)
{@claim.Type@claim.Value
}

AuthenticationProperties

@foreach (var prop in (awaitContext.AuthenticateAsync()).Properties.Items)
{@prop.Key@prop.Value
}

三.最后效果以及源码地址

GitHub地址:https://github.com/zaranetCore/aspNetCore_JsonwebToken/tree/master/src/Identity.Cookie/DotNetCore_Cookie_Sample

出处:https://www.cnblogs.com/ZaraNet/p/12099286.html、版权申明:本文来源于网友收集或网友提供,如果有侵权,请转告版主或者留言,本公众号立即删除。

asp 文本转时间_三分钟学会在ASP.NET Core MVC 中使用Cookie相关推荐

  1. Juniper 210 密码清不掉_三分钟学会如何找回mysql密码

    一.在测试工作中我们肯定会写一些sq查询语句方便我们验证数据是否正确,从而判断当前软件是否存在缺陷,但是查询的过程中肯定需要我们先连接数据库,如果数据库密码忘记我们就无法完成工作,这里就教会大家如何快 ...

  2. excel筛选排序从小到大_三分钟学会Excel排序功能,为你节省时间,注意收藏!...

    写在前面 为了让大家能以轻松的心态阅读文章,所以采用了模拟场景对话的方式,来分享办公软件使用心得. 小简,职场新人. 大道,有一定办公软件操作技能,乐于助人. 正文开始 本期和下期两期内容,是网友&q ...

  3. kdj超卖_三分钟学会KDJ三大买卖绝技,简单高效,把握最佳买卖点,不懂KDJ的股民值得一看!...

    本文由公众号:越声策略(yslc188)整理,仅供参考,不构成操作建议.如自行操作,注意仓位控制和风险自负. KDJ指标是一种相对较容易理解的技术指标之一,但若想真正的掌握并正确的运用就需要我们对其进 ...

  4. derby mysql 同步_三分钟学会使用Derby数据库

    Derby数据库是一个纯用Java实现的内存数据库,属于Apache的一个开源项目.由于是用Java实现的,所以可以在任何平台上运行:另外一个特点是体积小,免安装,java1.6开始集成了derby数 ...

  5. html自适应布局_三分钟学会响应式布局和自适应布局

    响应式布局和自适应布局详解 响应式布局等于流动网格布局,而自适应布局等于使用固定分割点来进行布局. 自适应布局给了你更多设计的空间,因为你只用考虑几种不同的状态.而在响应式布局中你却得考虑上百种不同的 ...

  6. oracle12c官方文档中文版_三分钟让你真正读懂oracle12c 中cdb pdb概念及原理

    Oracle 12C引入了CDB与PDB的新特性,在ORACLE 12C数据库引入的多租用户环境(Multitenant Environment)中,允许一个数据库容器(CDB)承载多个可插拔数据库( ...

  7. python 自动补全函数括号_三分钟,让你弄清楚Python中函数的括号使用

    喜欢编程,热爱分享,希望能结交更多志同道合的朋友,一起在学习Python的道路上走得更远! 一直以来对python中函数括号的使用,有点分不清楚,到底什么时候用括号,什么时候不用括号,造成了很大困惑. ...

  8. python怎么快速打括号_三分钟,让你弄清楚Python中函数的括号使用

    一直以来对python中函数括号的使用,有点分不清楚,到底什么时候用括号,什么时候不用括号,造成了很大困惑. 执行结果: 根据结果来分析: 1. x = aaa aaa是一个类名,后面没加括号,打印结 ...

  9. 三分钟学会css3中的flexbox布局

    2019独角兽企业重金招聘Python工程师标准>>> 这篇文章里我们将学习CSS里flexbox布局的几个最重要的概念,通过学习flexbox布局,你会发现以往遇到的所有的关于布局 ...

最新文章

  1. R语言构建xgboost模型:使用xgboost的第一颗树(前N颗树)进行预测推理或者使用全部树进行预测推理、比较误分类率指标
  2. 大数据应用开发八大基本原则
  3. Java-CAS初探
  4. Android listview 的应用
  5. Iptables 入门进阶
  6. GitHub for Windows使用教程(二) 分支的使用
  7. python如何统计累计每日的人数‘’_每日一练 | Data Scientist amp; Business Analyst amp; Leetcode 面试题 902...
  8. 数据结构与算法之循环队列的操作
  9. 8 函数类型——《Swift3.0从入门到出家
  10. 螺杆泵matlab,基于Matlab与VC++混合编程的螺杆泵转子型线设计
  11. 卡饭里的云计算机,微云可以在电脑用吗
  12. 信用评分卡 (part 1 of 7)
  13. .net5 不支持winform_.NET5.0 单文件发布打包操作深度剖析
  14. 世界豪车 TOP 10
  15. 记湖南省第十六届软件设计大赛
  16. Javascript实战应用篇(2):继续完善网页文本框系列(增加水印和提示)
  17. c语言列宽作用,c语言|格式化输入输出详解
  18. 桂林电子科技大学校园网登录数据包抓取教程实现路由器每天自动登录
  19. 瑞芯微板子人脸识别demo展现
  20. Java导出Excel(Poi详解)

热门文章

  1. swagger2 注解说明文档
  2. 无线策略服务器,无线网络中的分布式资源管理策略研究
  3. 送给即将春秋招的同学--一名服务端开发工程师的校招面经总结
  4. Java集合系列---ConcurrentHashMap源码解析
  5. 服务器数据库带宽费开票项目,服务器带宽和访问数据库速度
  6. 服务器500g硬盘分区方案,win7500g硬盘分区方案
  7. pip install mysqlclient 报错:error: Microsoft Visual C++ 14.0 is required.
  8. Django基础-安装配置
  9. Apollo 1 融合 Spring 的三个入口
  10. Metaspace泄漏排查