请选择 进入手机版 | 继续访问电脑版

[ASP.NET] asp.net core3.1cookie和jwt混合认证授权实现多种身份验证方案

[复制链接]
查看140 | 回复31 | 2021-9-15 07:03:03 | 显示全部楼层 |阅读模式
目次

开辟 了一个公司内部体系 ,使用 asp.net core 3.1。在开辟 用户认证授权使用 的是简单的cookie认证方式,然后开辟 好了要写几个接口给别的 体系 调用数据。并且只是几个简单的接口不预备 再重新部署一个站点,以是 就直接在MVC的项目内里 加了一个API地区 用来写接口。这时间 由于 是接口以是 就不能用cookie方式举行 认证,得加一个jwt认证,采用多种身份验证方案来举行 认证授权。

认证授权

身份验证是确定用户身份的过程。 授权是确定用户是否有权访问资源的过程。 在 ASP.NET Core 中,身份验证由 IAuthenticationService 负责,而它供身份验证中心 件使用 。 身份验证服务会使用 已注册的身份验证处理程序来完成与身份验证相干 的操作。

  1. 认证-->授权
复制代码

关于认证授权我们要区分认证和授权是两个概念,详细 可查看MSDN官方文档也可以搜刮 别的 文章看看,讲的很多。此中 包括OAuth 2.0 以及jwt的相干 知识都有很多资料并且讲解的很好。

身份认证

身份验证方案由 Startup.ConfigureServices 中的注册身份验证服务指定:
方式是在调用 services.AddAuthentication 后调用方案特定的扩展方法(比方 AddJwtBearer 或 AddCookie)。 这些扩展方法使用 AuthenticationBuilder.AddScheme 向得当 的设置注册方案。

添加cookie JwtBearer验证方案

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddSession();
  4. services.AddMvc(o =>
  5. {
  6. o.Filters.Add(typeof(MyExceptionFilterAttribute));// 全局异常Filter
  7. }).AddRazorRuntimeCompilation();
  8. //添加身份认证方案
  9. var jwtConfig= Configuration.GetSection("Jwt").Get<JwtConfig>();
  10. services.AddAuthentication
  11. (authoption =>{
  12. //指定默认选项
  13. authoption.DefaultChallengeScheme= CookieAuthenticationDefaults.AuthenticationScheme;
  14. authoption.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
  15. authoption.DefaultSignOutScheme = CookieAuthenticationDefaults.AuthenticationScheme;
  16. authoption.DefaultSignInScheme= CookieAuthenticationDefaults.AuthenticationScheme;
  17. })
  18. .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, option =>
  19. {
  20. option.Cookie.Name = "adCookie";//设置存储用户登录信息(用户Token信息)的Cookie名称
  21. option.Cookie.HttpOnly = true;//设置存储用户登录信息(用户Token信息)的Cookie,无法通过客户端浏览器脚本(如JavaScript等)访问到
  22. option.ExpireTimeSpan = TimeSpan.FromDays(3);// 过期时间
  23. option.SlidingExpiration = true;// 是否在过期时间过半的时候,自动延期
  24. option.LoginPath = "/Account/Login";
  25. option.LogoutPath = "/Account/LoginOut";
  26. })
  27. .AddJwtBearer(option =>
  28. {
  29. option.TokenValidationParameters = new TokenValidationParameters
  30. {
  31. ValidIssuer = jwtConfig.Issuer,
  32. ValidAudience = jwtConfig.Audience,
  33. ValidateIssuer = true,
  34. ValidateLifetime = jwtConfig.ValidateLifetime,
  35. IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtConfig.SigningKey)),
  36. //缓冲过期时间,总的有效时间等于这个时间加上jwt的过期时间
  37. ClockSkew = TimeSpan.FromSeconds(0)
  38. };
  39. });
  40. }
复制代码

JwtBearer认证的设置 参数类JwtConfig

  1. public class JwtConfig
  2. {
  3. /// <summary>
  4. /// 谁颁发的
  5. /// </summary>
  6. public string Issuer { get; set; }
  7. /// <summary>
  8. /// 颁发给谁
  9. /// </summary>
  10. public string Audience { get; set; }
  11. /// <summary>
  12. /// 令牌密码
  13. /// a secret that needs to be at least 16 characters long
  14. /// </summary>
  15. public string SigningKey { get; set; }
  16. /// <summary>
  17. /// 过期时间(分钟)
  18. /// </summary>
  19. public int Expires { get; set; }
  20. /// <summary>
  21. /// 是否校验过期时间
  22. /// </summary>
  23. public bool ValidateLifetime { get; set; }
  24. }
复制代码

appsettings.json 设置 参数

  1. "Jwt": {
  2. "Issuer": "issuer",
  3. "Audience": "audience",
  4. "SigningKey": "c0d32c63-z43d-4917-bbc2-5e726d087452",
  5. //过期时间(分钟)
  6. "Expires": 10080,
  7. //是否验证过期时间
  8. "ValidateLifetime": true
  9. }
复制代码

添加身份验证中心 件

  1. 通过在应用的 IApplicationBuilder 上调用 UseAuthentication 扩展方法,在 Startup.Configure 中添加身份验证中间件。 如果调用 UseAuthentication,会注册使用之前注册的身份验证方案的中间节。 请在依赖于要进行身份验证的用户的所有中间件之前调用 UseAuthentication。 如果使用终结点路由,则必须按以下顺序调用 UseAuthentication:
复制代码
  • 在 UseRouting之后调用,以便路由信息可用于身份验证决议 。
  • 在 UseEndpoints 之前调用,以便用户在颠末 身份验证后才能访问闭幕 点。
  1. public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  2. {
  3. if (env.IsDevelopment())
  4. {
  5. app.UseDeveloperExceptionPage();
  6. }
  7. else
  8. {
  9. app.UseExceptionHandler("/Home/Error");
  10. app.UseHsts();
  11. }
  12. app.UseHttpsRedirection();
  13. app.UseSession();
  14. app.UseRouting();
  15. //开启认证中间件
  16. app.UseAuthentication();
  17. //开启授权中间件
  18. app.UseAuthorization();
  19. app.UseEndpoints(endpoints =>
  20. {
  21. endpoints.MapControllerRoute(
  22. name: "areas",
  23. pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
  24. endpoints.MapControllerRoute(
  25. name: "default",
  26. pattern: "{controller=Home}/{action=Index}/{id?}");
  27. });
  28. }
复制代码

cookie认证

  1. [HttpPost]
  2. public async Task<NewtonsoftJsonResult> LoginIn(string userName, string userPassword, string code)
  3. {
  4. AjaxResult objAjaxResult = new AjaxResult();
  5. var user = _userBll.GetUser(userName, userPassword);
  6. if (user == null)
  7. {
  8. objAjaxResult.Result = DoResult.NoAuthorization;
  9. objAjaxResult.PromptMsg = "用户名或密码错误";
  10. }
  11. else
  12. {
  13. var claims = new List<Claim>
  14. {
  15. new Claim("userName", userName),
  16. new Claim("userID",user.Id.ToString()),
  17. };
  18. await HttpContext.SignInAsync(new ClaimsPrincipal(new ClaimsIdentity(claims,CookieAuthenticationDefaults.AuthenticationScheme)));
  19. objAjaxResult.Result = DoResult.Success;
  20. objAjaxResult.PromptMsg = "登录成功";
  21. }
  22. return new NewtonsoftJsonResult(objAjaxResult);
  23. }
复制代码

jwt认证

  1. [HttpPost]
  2. public NewtonsoftJsonResult Token([FromBody] UserInfo model)
  3. {
  4. AjaxResult objAjaxResult = new AjaxResult();
  5. var user = _userBll.GetUser(model.UserName, model.Password);
  6. if (user == null)
  7. {
  8. objAjaxResult.Result = DoResult.NoAuthorization;
  9. objAjaxResult.PromptMsg = "用户名或密码错误";
  10. }
  11. else
  12. {
  13. //jwtTokenOptions 是通过配置获取上面配置的参数信息
  14. var jwtTokenOptions = BaseConfigModel.jwtConfig;
  15. var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtTokenOptions.SigningKey));
  16. var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
  17. //身份
  18. var claims = new List<Claim>
  19. {
  20. new Claim("userID",user.Id.ToString()),
  21. new Claim("userName",user.UserName),
  22. };
  23. //令牌
  24. var expires = DateTime.Now.AddMinutes(jwtTokenOptions.Expires);
  25. var token = new JwtSecurityToken(
  26. issuer: jwtTokenOptions.Issuer,
  27. audience: jwtTokenOptions.Audience,
  28. claims: claims,
  29. notBefore: DateTime.Now,
  30. expires: expires,
  31. signingCredentials: credentials
  32. );
  33. string jwtToken = new JwtSecurityTokenHandler().WriteToken(token);
  34. objAjaxResult.Result = DoResult.Success;
  35. objAjaxResult.RetValue = new
  36. {
  37. token = jwtToken
  38. };
  39. objAjaxResult.PromptMsg = "登录成功";
  40. }
  41. return new NewtonsoftJsonResult(objAjaxResult);
  42. }
复制代码

授权

在授权时,应用指示要使用 的处理程序。 选择应用程序将通过以逗号分隔的身份验证方案列表传递到来授权的处理程序 [Authorize] 。 [Authorize]属性指定要使用 的身份验证方案或方案,不管是否设置 了默认。

默认授权

由于 上面认证设置 中我们使用 cookie作为默认设置 ,所从前 端对应的controller就不用指定验证方案,直接打上[Authorize]即可。

asp.net core3.1cookie和jwt混合认证授权实现多种身份验证方案

选择授权

对于API接口我们使用 Jwt授权,在Controller上打上指定方案。

  1. [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
复制代码

asp.net core3.1cookie和jwt混合认证授权实现多种身份验证方案

总结

关于多种方案混合验证授权的流程:
1、设置 认证方案(相干 的设置 参数可采用设置 文件情势 )。
2、添加授权验证中心 件。
3、提供认证接口。
4、设置 必要 授权的接口授权方案。

到此这篇关于asp.net core3.1cookie和jwt混合认证授权实现多种身份验证方案的文章就先容 到这了,更多相干 asp.net core cookie和jwt认证授权内容请搜刮 脚本之家从前 的文章或继续欣赏 下面的相干 文章渴望 大家以后多多支持脚本之家!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

avatar 护研的墙偃 | 2021-9-16 10:46:30 | 显示全部楼层
admin楼主的帖子越来越有深度了!
回复

使用道具 举报

avatar 肥皂沫沫盘 | 2021-9-16 11:01:14 | 显示全部楼层
最近回了很多帖子,都没人理我!
回复

使用道具 举报

avatar 章牛险 | 2021-9-22 04:40:31 | 显示全部楼层
看帖不回帖都是耍流氓!
回复

使用道具 举报

avatar 白度了一生一x | 2021-9-22 04:40:34 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的源码论坛他的站点都是商业源码,还是免费下载的那种!特别好用。访问地址:http://www.mxswl.com 猫先森网络
回复

使用道具 举报

avatar 公务员老虫叭 | 2021-9-22 16:44:46 | 显示全部楼层
看了这么多帖子,第一次看到这么有深度了!
回复

使用道具 举报

avatar 右脸破相gl | 2021-9-24 01:33:47 | 显示全部楼层
admin楼主是一个典型的文艺青年啊!
回复

使用道具 举报

avatar 123457846 | 2021-9-27 00:08:00 | 显示全部楼层
楼上的说的很多!
回复

使用道具 举报

avatar 豆芽角角123 | 2021-10-5 02:56:29 | 显示全部楼层
好好学习admin楼主的帖子!
回复

使用道具 举报

avatar 笑看人生458 | 2021-10-5 04:09:42 | 显示全部楼层
有节操!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则