3分钟快速学会在ASP.NET Core MVC中如何使用Cookie
一.Cookie是什么?
我的朋友问我cookie是什么,用来干什么的,可是我居然无法清楚明白简短地向其阐述cookie,这不禁让我陷入了沉思:为什么我无法解释清楚,我对学习的方法产生了怀疑!所以我们在学习一个东西的时候,一定要做到知其然知其所以然。
HTTP协议本身是无状态的。什么是无状态呢,即服务器无法判断用户身份。Cookie实际上是一小段的文本信息)。客户端向服务器发起请求,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。
打个比方,这就犹如你办理了银行卡,下次你去银行办业务,直接拿银行卡就行,不需要身份证。
二.在.NETCore中尝试
废话不多说,干就完了,现在我们创建ASP.NETCoreMVC项目,撰写该文章时使用的.NETCoreSDK3.0构建的项目,创建完毕之后我们无需安装任何包,
但是我们需要在Startup中添加一些配置,用于Cookie相关的。
//publicconststringCookieScheme="YourSchemeName"; publicStartup(IConfigurationconfiguration) { Configuration=configuration; } publicIConfigurationConfiguration{get;} //Thismethodgetscalledbytheruntime.Usethismethodtoaddservicestothecontainer. publicvoidConfigureServices(IServiceCollectionservices) { //CookieAuthenticationDefaults.AuthenticationSchemeCookiesDefaultValue //youcanchangescheme services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options=>{ options.LoginPath="/LoginOrSignOut/Index/"; }); services.AddControllersWithViews(); //isabletoalsouseotherservices. //services.AddSingleton,ConfigureMyCookie>(); }
在其中我们配置登录页面,其中AddAuthentication中是我们的方案名称,这个是做什么的呢?很多小伙伴都懵懵懂懂表示很懵逼啊,我看很多人也是都写得默认,那它到底有啥用,经过我看AspNetCore源码发现它这个是可以做一些配置的。看下面的代码:
internalclassConfigureMyCookie:IConfigureNamedOptions{ //Youcaninjectserviceshere publicConfigureMyCookie() {} publicvoidConfigure(stringname,CookieAuthenticationOptionsoptions) { //Onlyconfiguretheschemesyouwant //if(name==Startup.CookieScheme) //{ //options.LoginPath="/someotherpath"; //} } publicvoidConfigure(CookieAuthenticationOptionsoptions) =>Configure(Options.DefaultName,options); }
在其中你可以定义某些策略,随后你直接改变CookieScheme的变量就可以替换某些配置,在配置中一共有这几项,这无疑是帮助我们快速使用Cookie的好帮手~点个赞。
在源码中可以看到Cookie默认保存的时间是14天,这个时间我们可以去选择,支持TimeSpan的那些类型。
publicCookieAuthenticationOptions() { ExpireTimeSpan=TimeSpan.FromDays(14); ReturnUrlParameter=CookieAuthenticationDefaults.ReturnUrlParameter; SlidingExpiration=true; Events=newCookieAuthenticationEvents(); }
接下来LoginOrOutController,我们模拟了登录和退出,通过SignInAsync和SignOutAsync方法。
[HttpPost] publicasyncTaskLogin(LoginModelloginModel) { if(loginModel.Username=="haozizhang"&& loginModel.Password=="123456") { varclaims=newList { newClaim(ClaimTypes.Name,loginModel.Username) }; ClaimsPrincipalprincipal=newClaimsPrincipal(newClaimsIdentity(claims,"login")); awaitHttpContext.SignInAsync(principal); //Justredirecttoourindexafterloggingin. returnRedirect("/Home/Index"); } returnView("Index"); } /// ///thisactionforweblagout /// [HttpGet] publicIActionResultLogout() { Task.Run(async()=> { //注销登录的用户,相当于ASP.NET中的FormsAuthentication.SignOut awaitHttpContext.SignOutAsync(); }).Wait(); returnView(); }
就拿出推出的源码来看,其中获取了Handler的某些信息,随后将它转换为IAuthenticationSignOutHandler接口类型,这个接口as接口,像是在地方实现了这个接口,然后将某些运行时的值引用传递到该接口上。
publicvirtualasyncTaskSignOutAsync(HttpContextcontext,stringscheme,AuthenticationPropertiesproperties) { if(scheme==null) { vardefaultScheme=awaitSchemes.GetDefaultSignOutSchemeAsync(); scheme=defaultScheme?.Name; if(scheme==null) { thrownewInvalidOperationException($"NoauthenticationSchemewasspecified,andtherewasnoDefaultSignOutSchemefound.ThedefaultschemescanbesetusingeitherAddAuthentication(stringdefaultScheme)orAddAuthentication(ActionconfigureOptions)."); } } varhandler=awaitHandlers.GetHandlerAsync(context,scheme); if(handler==null) { throwawaitCreateMissingSignOutHandlerException(scheme); } varsignOutHandler=handlerasIAuthenticationSignOutHandler; if(signOutHandler==null) { throwawaitCreateMismatchedSignOutHandlerException(scheme,handler); } awaitsignOutHandler.SignOutAsync(properties); }
其中GetHandlerAsync中根据认证策略创建了某些实例,这里不再多说,因为源码深不见底,我也说不太清楚...只是想表达一下看源码的好处和坏处....
publicasyncTaskGetHandlerAsync(HttpContextcontext,stringauthenticationScheme) { if(_handlerMap.ContainsKey(authenticationScheme)) { return_handlerMap[authenticationScheme]; } varscheme=awaitSchemes.GetSchemeAsync(authenticationScheme); if(scheme==null) { returnnull; } varhandler=(context.RequestServices.GetService(scheme.HandlerType)?? ActivatorUtilities.CreateInstance(context.RequestServices,scheme.HandlerType)) asIAuthenticationHandler; if(handler!=null) { awaithandler.InitializeAsync(scheme,context); _handlerMap[authenticationScheme]=handler; } returnhandler; }
最后我们在页面上想要获取登录的信息,可以通过HttpContext.User.Claims中的签名信息获取。
@usingMicrosoft.AspNetCore.AuthenticationHttpContext.User.Claims
-
@foreach(varclaiminUser.Claims)
{
- @claim.Type
- @claim.Value }
AuthenticationProperties
-
@foreach(varpropin(awaitContext.AuthenticateAsync()).Properties.Items)
{
- @prop.Key
- @prop.Value }
三.最后效果以及源码地址#
GitHub地址:https://github.com/zaranetCore/aspNetCore_JsonwebToken/tree/master/src/Identity.Cookie/DotNetCore_Cookie_Sample
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。