在以前的Asp.Net中可以用 FormsAuthentication 类的一系列方法来使用加密的Cookie存储用户身份,使用简单,可控性强。在Asp.Net Core中是否也可以的?答案是当然的。

使用步骤:

1、在 project.json 中添加项目依赖 "Microsoft.AspNetCore.Authentication.Cookies": "1.0.0"

  1. "dependencies": {
  2. "Microsoft.NETCore.App": {
  3. "version": "1.0.1",
  4. "type": "platform"
  5. },
  6. "Microsoft.AspNetCore.Diagnostics": "1.0.0",
  7. "Microsoft.AspNetCore.Mvc": "1.0.1",
  8. "Microsoft.AspNetCore.Razor.Tools": {
  9. "version": "1.0.0-preview2-final",
  10. "type": "build"
  11. },
  12. "Microsoft.AspNetCore.Routing": "1.0.1",
  13. "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0",
  14. "Microsoft.AspNetCore.Server.Kestrel": "1.0.1",
  15. "Microsoft.AspNetCore.StaticFiles": "1.0.0",
  16. "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0",
  17. "Microsoft.Extensions.Configuration.Json": "1.0.0",
  18. "Microsoft.Extensions.Logging": "1.0.0",
  19. "Microsoft.Extensions.Logging.Console": "1.0.0",
  20. "Microsoft.Extensions.Logging.Debug": "1.0.0",
  21. "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0",
  22. "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0",
  23. "Microsoft.AspNetCore.Authentication.Cookies": "1.0.0"
  24. }

2、在 Startup.cs 中添加中间件:

  1.      public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
  2. {
  3. loggerFactory.AddConsole(Configuration.GetSection("Logging"));
  4. loggerFactory.AddDebug();
  5.  
  6. if (env.IsDevelopment())
  7. {
  8. app.UseDeveloperExceptionPage();
  9. app.UseBrowserLink();
  10. }
  11. else
  12. {
  13. app.UseExceptionHandler("/Home/Error");
  14. }
  15.  
  16. app.UseStaticFiles();
  17.  
  18. app.UseCookieAuthentication(new CookieAuthenticationOptions
  19. {
  20. AuthenticationScheme = "member",  // Cookie 验证方案名称,后面多处都需要用到,部分地方必须要求常量,所以直接配置为字符串。
  21. AutomaticAuthenticate = true,     // 是否自动启用验证,如果不启用,则即便客服端传输了Cookie信息,服务端也不会主动解析。
                                  // 除了明确配置了 [Authorize(ActiveAuthenticationSchemes = "上面的方案名")] 属性的地方,才会解析,此功能一般用在需要在同一应用中启用多种验证方案的时候。比如分Area.
  22. LoginPath = "/account/login"     // 登录页
  23. });
  24.  
  25. app.UseMvc(routes =>
  26. {
  27. routes.MapRoute(
  28. name: "default",
  29. template: "{controller=Home}/{action=Index}/{id?}");
  30. });
  31. }

3、创建一个新的 Controller,并添加登录的方法,大致如下:

  1.      [AllowAnonymous]
  2. public async Task<IActionResult> Login()
  3. {
  4. // 这里应该写业务逻辑来获取用户名,用户Id等信息。
  5.  
  6. var userId = ;
  7. var userName = "admin";
  8.  
  9. // ========================
  10.  
  11. var identity = new ClaimsIdentity("Forms"); // 指定身份认证类型
  12.  
  13. identity.AddClaim(new Claim(ClaimTypes.Sid, userId.ToString()));  // 用户Id
  14.  
  15. identity.AddClaim(new Claim(ClaimTypes.Name, userName));       // 用户名称
  16.  
  17. var principal = new ClaimsPrincipal(identity);
  18.  
  19. await HttpContext.Authentication.SignInAsync("member", principal, new AuthenticationProperties { IsPersistent = true });
  20.  
  21.        string returnUrl = Request.Query["returnUrl"];
  22.  
  23.        if (!string.IsNullOrEmpty(returnUrl)) return Redirect(returnUrl);
  24.  
  25.        return RedirectToAction("index", "account");
  1. }

4、退出登录方法:

  1. public async Task<IActionResult> Logout()
  2. {
  3. await HttpContext.Authentication.SignOutAsync("member");   // Startup.cs中配置的验证方案名

  4.        return RedirectToAction("index", "home");
         }

5、获取用户信息:

  1. [Authorize(ActiveAuthenticationSchemes = "member")]
  2. public IActionResult Index()
  3. {
  4. var userId = User.FindFirst(ClaimTypes.Sid).Value;
  5.  
  6. var userName = User.Identity.Name;
  7.  
  8. return Json(new { Id = userId, Name = userName });
  9. }

其它说明:

这里生成的Cookie是加密过的,大概如下:

相关的Cookie名称,域,过期时间等都可以在 Startup.cs 中进行设置,大概如下:

  1. app.UseCookieAuthentication(new CookieAuthenticationOptions
  2. {
  3. AuthenticationScheme = "member", // 验证方案名
  4. AutomaticAuthenticate = true, // 是否自动启用验证
  5. LoginPath = "/account/login", // 登录地址
  6. CookieDomain = "abc.com", // 验证域
  7. CookieName = "abc", // Cookie 名称
  8. CookiePath = "/", // Cookie 路径
  9. ExpireTimeSpan = TimeSpan.FromDays(), // 过期时间
  10. SlidingExpiration = true, // 是否在过期时间过半的时候,自动延期
  11. CookieHttpOnly = true // 是否允许客户端Js获取。默认True,不允许。
  12. });

步骤很简单,也是极好用的,若结合是否自动启用验证的AutomaticAuthenticate来进行Area分区域认证,灵活性更强。

Asp.Net Core 简单的使用加密的Cookie保存用户状态的更多相关文章

  1. [转]Asp.Net Core 简单的使用加密的Cookie保存用户状态

    本文转自:http://www.cnblogs.com/Joes/p/6023820.html 在以前的Asp.Net中可以用 FormsAuthentication 类的一系列方法来使用加密的Coo ...

  2. ASP.NET Core 简单实现七牛图片上传(FormData 和 Base64)

    ASP.NET Core 简单实现七牛图片上传(FormData 和 Base64) 七牛图片上传 SDK(.NET 版本):https://developer.qiniu.com/kodo/sdk/ ...

  3. ASP.NET Core 简单集成签发 JWT (JSON Web Tokens)

    什么是 JWT ? 从 https://jwt.io/ 可以了解到对 JWT 的描述:JSON Web Tokens are an open, industry standard RFC 7519 m ...

  4. (0)ASP.NET Core 简单介绍 和开发环境搭建 - ASP.NET从MVC5升级到MVC6

    ASP.NET从MVC5升级到MVC6 总目录 ASP.NET Core 首先,ASP原本只是一种技术,这种技术从上个世纪90年代就有了. Active Service Page 和 Java Ser ...

  5. Asp.net core 简单介绍

    Asp.net core 是一个开源和跨平台的框架,用于构建如WEB应用,物联网(IoT)应用和移动后端应用等连接到互联网的基于云的现代应用程序.asp.net core 应用可运行.net和.net ...

  6. asp.net core 简单部署

    目的 练习asp.net core的技术使用.部署等.目前拥有一台阿里云服务器(超级低配版本),安装了centos系统,打算将练习项目发布到该环境中.可能需要做以下准备工作. 以前没接触过linux正 ...

  7. ASP.NET Core 简单引入教程

    0.简介 开源.跨平台 1.环境安装 参考官方教程   Core 官方文档 2.向世界问个好 sheel/cmd 下: dotnet --help // 查看帮助 dotnet new *     / ...

  8. 项目开发中的一些注意事项以及技巧总结 基于Repository模式设计项目架构—你可以参考的项目架构设计 Asp.Net Core中使用RSA加密 EF Core中的多对多映射如何实现? asp.net core下的如何给网站做安全设置 获取服务端https证书 Js异常捕获

    项目开发中的一些注意事项以及技巧总结   1.jquery采用ajax向后端请求时,MVC框架并不能返回View的数据,也就是一般我们使用View().PartialView()等,只能返回json以 ...

  9. ASP.NET Core 2.0 多应用实现Cookie共享

    前言 .NET Core 2.0 发布之后,在Authentication中间件部分,相关API有不少改动(官方文档),本文主要讲的就是实现应用Cookie共享,对Cookie中间件使用不了解的可以去 ...

随机推荐

  1. C# Enum Name String Description之间的相互转换

    最近工作中经常用到Enum中Value.String.Description之间的相互转换,特此总结一下. 1.首先定义Enum对象 public enum Weekday { [Descriptio ...

  2. C#中正则表达式在replace中的应用!

    多少年来,许多的编程语言和工具都包含对正则表达式的支持,.NET基础类库中包含有一个名字空间和一系列可以充分发挥规则表达式威力的类,而且它们也都与未来的Perl 5中的规则表达式兼容.     此外, ...

  3. 一元多项式的乘法与加法运算(C语言)

    输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. 输出格式: 输出分2行,分别以指数递降方 ...

  4. C#综合揭秘——通过修改注册表建立Windows自定义协议

    引言 本文主要介绍注册表的概念与其相关根项的功能,以及浏览器如何通过连接调用自定义协议并与客户端进行数据通信.文中讲及如何通过C#程序.手动修改.安装项目等不同方式对注册表进行修改.其中通过安装项目对 ...

  5. CSS实现弹出导航菜单

    查看实际效果:http://keleyi.com/a/bjac/vksd7321.htm 完整代码,保存在html文件打开也可看到效果: <!DOCTYPE html PUBLIC " ...

  6. 向ES6靠齐的Class.js

    写在前面 在2008年的时候,John Resig写了一 Class.js,使用的方式如下: var Person = Class.extend({ init: function(isDancing) ...

  7. 纯CSS3魔方的制作

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  8. Android开发1:基本UI界面设计——布局和组件

    前言 啦啦啦~本学期要开始学习Android开发啦~ 博主在开始学习前是完完全全的小白,只有在平时完成老师要求的实验的过程中一步一步学习~从此篇博文起,博主将开始发布Android开发有关的博文,希望 ...

  9. Intent属性详解二 Action、Category

    先看效果图: 1.Action:该activity可以执行的动作 该标识用来说明这个activity可以执行哪些动作,所以当隐式intent传递过来action时,如果跟这里<intent-fi ...

  10. android 很详细的序列化过程Parcelable

    直接上代码:注释都写的很清楚了. public class Entry implements Parcelable{ public int userID; public String username ...