系统城装机大师 - 固镇县祥瑞电脑科技销售部宣传站!

当前位置:首页 > 网络编程 > ASP.NET > 详细页面

3分钟快速学会在ASP.NET Core MVC中如何使用Cookie

时间:2020-02-03来源:系统城作者:电脑系统城

一.Cookie是什么?

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

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

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

二.在.NET Core中尝试

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

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


 
  1. //public const string CookieScheme = "YourSchemeName";
  2. public Startup(IConfiguration configuration)
  3. {
  4. Configuration = configuration;
  5. }
  6. public IConfiguration Configuration { get; }
  7. // This method gets called by the runtime. Use this method to add services to the container.
  8. public void ConfigureServices(IServiceCollection services)
  9. {
  10. //CookieAuthenticationDefaults.AuthenticationScheme Cookies Default Value
  11. //you can change scheme
  12. services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
  13. .AddCookie(options => {
  14. options.LoginPath = "/LoginOrSignOut/Index/";
  15. });
  16. services.AddControllersWithViews();
  17. // is able to also use other services.
  18. //services.AddSingleton<IConfigureOptions<CookieAuthenticationOptions>, ConfigureMyCookie>();
  19. }

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


 
  1. internal class ConfigureMyCookie : IConfigureNamedOptions<CookieAuthenticationOptions>
  2. {
  3. // You can inject services here
  4. public ConfigureMyCookie()
  5. {}
  6. public void Configure(string name, CookieAuthenticationOptions options)
  7. {
  8. // Only configure the schemes you want
  9. //if (name == Startup.CookieScheme)
  10. //{
  11. // options.LoginPath = "/someotherpath";
  12. //}
  13. }
  14. public void Configure(CookieAuthenticationOptions options)
  15. => Configure(Options.DefaultName, options);
  16. }

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

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


 
  1. public CookieAuthenticationOptions()
  2. {
  3. ExpireTimeSpan = TimeSpan.FromDays(14);
  4. ReturnUrlParameter = CookieAuthenticationDefaults.ReturnUrlParameter;
  5. SlidingExpiration = true;
  6. Events = new CookieAuthenticationEvents();
  7. }

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


 
  1. [HttpPost]
  2. public async Task<IActionResult> Login(LoginModel loginModel)
  3. {
  4. if (loginModel.Username == "haozi zhang" &&
  5. loginModel.Password == "123456")
  6. {
  7. var claims = new List<Claim>
  8. {
  9. new Claim(ClaimTypes.Name, loginModel.Username)
  10. };
  11. ClaimsPrincipal principal = new ClaimsPrincipal(new ClaimsIdentity(claims, "login"));
  12. await HttpContext.SignInAsync(principal);
  13. //Just redirect to our index after logging in.
  14. return Redirect("/Home/Index");
  15. }
  16. return View("Index");
  17. }
  18. /// <summary>
  19. /// this action for web lagout
  20. /// </summary>
  21. [HttpGet]
  22. public IActionResult Logout()
  23. {
  24. Task.Run(async () =>
  25. {
  26. //注销登录的用户,相当于ASP.NET中的FormsAuthentication.SignOut
  27. await HttpContext.SignOutAsync();
  28. }).Wait();
  29. return View();
  30. }

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


 
  1. public virtual async Task SignOutAsync(HttpContext context, string scheme,AuthenticationProperties properties)
  2. {
  3. if (scheme == null)
  4. {
  5. var defaultScheme = await Schemes.GetDefaultSignOutSchemeAsync();
  6. scheme = defaultScheme?.Name;
  7. if (scheme == null)
  8. {
  9. 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<AuthenticationOptions> configureOptions).");
  10. }
  11. }
  12. var handler = await Handlers.GetHandlerAsync(context, scheme);
  13. if (handler == null)
  14. {
  15. throw await CreateMissingSignOutHandlerException(scheme);
  16. }
  17. var signOutHandler = handler as IAuthenticationSignOutHandler;
  18. if (signOutHandler == null)
  19. {
  20. throw await CreateMismatchedSignOutHandlerException(scheme, handler);
  21. }
  22. await signOutHandler.SignOutAsync(properties);
  23. }

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


 
  1. public async Task<IAuthenticationHandler> GetHandlerAsync(HttpContext context, stringauthenticationScheme)
  2. {
  3. if (_handlerMap.ContainsKey(authenticationScheme))
  4. {
  5. return _handlerMap[authenticationScheme];
  6. }
  7.  
  8. var scheme = await Schemes.GetSchemeAsync(authenticationScheme);
  9. if (scheme == null)
  10. {
  11. return null;
  12. }
  13. var handler = (context.RequestServices.GetService(scheme.HandlerType) ??
  14. ActivatorUtilities.CreateInstance(context.RequestServices, scheme.HandlerType))
  15. as IAuthenticationHandler;
  16. if (handler != null)
  17. {
  18. await handler.InitializeAsync(scheme, context);
  19. _handlerMap[authenticationScheme] = handler;
  20. }
  21. return handler;
  22. }

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


 
  1. @using Microsoft.AspNetCore.Authentication
  2. <h2>HttpContext.User.Claims</h2>
  3. <dl>
  4. @foreach (var claim in User.Claims)
  5. {
  6. <dt>@claim.Type</dt>
  7. <dd>@claim.Value</dd>
  8. }
  9. </dl>
  10. <h2>AuthenticationProperties</h2>
  11. <dl>
  12. @foreach (var prop in (await Context.AuthenticateAsync()).Properties.Items)
  13. {
  14. <dt>@prop.Key</dt>
  15. <dd>@prop.Value</dd>
  16. }
  17. </dl>

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

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。

分享到:

相关信息

系统教程栏目

栏目热门教程

人气教程排行

站长推荐

热门系统下载