asp.net core3.1cookie和jwt混合认证授权实现多种身份验证方案
开发了一个公司内部系统,使用asp.net core 3.1。在开发用户认证授权使用的是简单的cookie认证方式,然后开发好了要写几个接口给其它系统调用数据。并且只是几个简单的接口不准备再重新部署一个站点,所以就直接在MVC的项目里面加了一个API区域用来写接口。这时候因为是接口所以就不能用cookie方式进行认证,得加一个jwt认证,采用多种身份验证方案来进行认证授权。
认证授权
身份验证是确定用户身份的过程。 授权是确定用户是否有权访问资源的过程。 在 ASP.NET Core 中,身份验证由 IAuthenticationService 负责,而它供身份验证中间件使用。 身份验证服务会使用已注册的身份验证处理程序来完成与身份验证相关的操作。
认证-->授权
关于认证授权我们要区分认证和授权是两个概念,具体可查看MSDN官方文档也可以搜索其它文章看看,讲的很多。其中包括OAuth 2.0 以及jwt的相关知识都有很多资料并且讲解的很好。
身份认证
身份验证方案由 Startup.ConfigureServices 中的注册身份验证服务指定:
方式是在调用 services.AddAuthentication 后调用方案特定的扩展方法(例如 AddJwtBearer 或 AddCookie)。 这些扩展方法使用 AuthenticationBuilder.AddScheme 向适当的设置注册方案。
添加cookie JwtBearer验证方案
public void ConfigureServices(IServiceCollection services) { services.AddSession(); services.AddMvc(o => { o.Filters.Add(typeof(MyExceptionFilterAttribute));// 全局异常Filter }).AddRazorRuntimeCompilation(); //添加身份认证方案 var jwtConfig= Configuration.GetSection("Jwt").Get<JwtConfig>(); services.AddAuthentication (authoption =>{ //指定默认选项 authoption.DefaultChallengeScheme= CookieAuthenticationDefaults.AuthenticationScheme; authoption.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme; authoption.DefaultSignOutScheme = CookieAuthenticationDefaults.AuthenticationScheme; authoption.DefaultSignInScheme= CookieAuthenticationDefaults.AuthenticationScheme; }) .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, option => { option.Cookie.Name = "adCookie";//设置存储用户登录信息(用户Token信息)的Cookie名称 option.Cookie.HttpOnly = true;//设置存储用户登录信息(用户Token信息)的Cookie,无法通过客户端浏览器脚本(如JavaScript等)访问到 option.ExpireTimeSpan = TimeSpan.FromDays(3);// 过期时间 option.SlidingExpiration = true;// 是否在过期时间过半的时候,自动延期 option.LoginPath = "/Account/Login"; option.LogoutPath = "/Account/LoginOut"; }) .AddJwtBearer(option => { option.TokenValidationParameters = new TokenValidationParameters { ValidIssuer = jwtConfig.Issuer, ValidAudience = jwtConfig.Audience, ValidateIssuer = true, ValidateLifetime = jwtConfig.ValidateLifetime, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtConfig.SigningKey)), //缓冲过期时间,总的有效时间等于这个时间加上jwt的过期时间 ClockSkew = TimeSpan.FromSeconds(0) }; }); }
JwtBearer认证的配置参数类JwtConfig
public class JwtConfig { /// <summary> /// 谁颁发的 /// </summary> public string Issuer { get; set; } /// <summary> /// 颁发给谁 /// </summary> public string Audience { get; set; } /// <summary> /// 令牌密码 /// a secret that needs to be at least 16 characters long /// </summary> public string SigningKey { get; set; } /// <summary> /// 过期时间(分钟) /// </summary> public int Expires { get; set; } /// <summary> /// 是否校验过期时间 /// </summary> public bool ValidateLifetime { get; set; } }
appsettings.json 配置参数
"Jwt": { "Issuer": "issuer", "Audience": "audience", "SigningKey": "c0d32c63-z43d-4917-bbc2-5e726d087452", //过期时间(分钟) "Expires": 10080, //是否验证过期时间 "ValidateLifetime": true }
添加身份验证中间件
通过在应用的 IApplicationBuilder 上调用 UseAuthentication 扩展方法,在 Startup.Configure 中添加身份验证中间件。 如果调用 UseAuthentication,会注册使用之前注册的身份验证方案的中间节。 请在依赖于要进行身份验证的用户的所有中间件之前调用 UseAuthentication。 如果使用终结点路由,则必须按以下顺序调用 UseAuthentication:
- 在 UseRouting之后调用,以便路由信息可用于身份验证决策。
- 在 UseEndpoints 之前调用,以便用户在经过身份验证后才能访问终结点。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseSession(); app.UseRouting(); //开启认证中间件 app.UseAuthentication(); //开启授权中间件 app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "areas", pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}"); endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); }
cookie认证
[HttpPost] public async Task<NewtonsoftJsonResult> LoginIn(string userName, string userPassword, string code) { AjaxResult objAjaxResult = new AjaxResult(); var user = _userBll.GetUser(userName, userPassword); if (user == null) { objAjaxResult.Result = DoResult.NoAuthorization; objAjaxResult.PromptMsg = "用户名或密码错误"; } else { var claims = new List<Claim> { new Claim("userName", userName), new Claim("userID",user.Id.ToString()), }; await HttpContext.SignInAsync(new ClaimsPrincipal(new ClaimsIdentity(claims,CookieAuthenticationDefaults.AuthenticationScheme))); objAjaxResult.Result = DoResult.Success; objAjaxResult.PromptMsg = "登录成功"; } return new NewtonsoftJsonResult(objAjaxResult); }
jwt认证
[HttpPost] public NewtonsoftJsonResult Token([FromBody] UserInfo model) { AjaxResult objAjaxResult = new AjaxResult(); var user = _userBll.GetUser(model.UserName, model.Password); if (user == null) { objAjaxResult.Result = DoResult.NoAuthorization; objAjaxResult.PromptMsg = "用户名或密码错误"; } else { //jwtTokenOptions 是通过配置获取上面配置的参数信息 var jwtTokenOptions = BaseConfigModel.jwtConfig; var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtTokenOptions.SigningKey)); var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); //身份 var claims = new List<Claim> { new Claim("userID",user.Id.ToString()), new Claim("userName",user.UserName), }; //令牌 var expires = DateTime.Now.AddMinutes(jwtTokenOptions.Expires); var token = new JwtSecurityToken( issuer: jwtTokenOptions.Issuer, audience: jwtTokenOptions.Audience, claims: claims, notBefore: DateTime.Now, expires: expires, signingCredentials: credentials ); string jwtToken = new JwtSecurityTokenHandler().WriteToken(token); objAjaxResult.Result = DoResult.Success; objAjaxResult.RetValue = new { token = jwtToken }; objAjaxResult.PromptMsg = "登录成功"; } return new NewtonsoftJsonResult(objAjaxResult); }
授权
在授权时,应用指示要使用的处理程序。 选择应用程序将通过以逗号分隔的身份验证方案列表传递到来授权的处理程序 [Authorize] 。 [Authorize]属性指定要使用的身份验证方案或方案,不管是否配置了默认。
默认授权
因为上面认证配置中我们使用cookie作为默认配置,所以前端对应的controller就不用指定验证方案,直接打上[Authorize]即可。
选择授权
对于API接口我们使用Jwt授权,在Controller上打上指定方案。
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
总结
关于多种方案混合验证授权的流程:
1、配置认证方案(相关的配置参数可采用配置文件形式)。
2、添加授权验证中间件。
3、提供认证接口。
4、配置需要授权的接口授权方案。
到此这篇关于asp.net core3.1cookie和jwt混合认证授权实现多种身份验证方案的文章就介绍到这了,更多相关asp.net core cookie和jwt认证授权内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!
相关文章
- PHPEMS(PHP Exam Management System)在线模拟考试系统基于PHP+Mysql开发,主要用于搭建模拟考试平台,支持多种题型和展现方式,是国内首款支持题冒题和自动评分与教师评分相...2016-11-25
- 这篇文章主要为大家详细介绍了ASP.NET购物车的实现过程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-22
- 这篇文章主要介绍了.NET Core下使用Kafka的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
- 在开发过程中,使用Visual Studio的断点调试功能可以很方便帮我们调试发现程序存在的错误,同样Visual Studio也支持对SQL Server里面的存储过程进行调试,下面就让我们看看具体的调试方法。...2021-09-22
- 本文实例讲述了JS使用cookie实现DIV提示框只显示一次的方法。分享给大家供大家参考,具体如下:这里运用JavaScript的cookie技术,控制网页上的提示DIV只显示一次,也就是当用户是第一次打开网页的时候才显示,第二次自动隐藏起...2015-11-08
- 这篇文章主要介绍了详解.NET Core 3.0 里新的JSON API,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
- 什么是SSO?单点登录SSO(Single Sign-On)是身份管理中的一部分。SSO的一种较为通俗的定义是:SSO是指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用中的受保护...2015-11-08
ASP.NET Core根据环境变量支持多个 appsettings.json配置文件
这篇文章主要介绍了ASP.NET Core根据环境变量支持多个 appsettings.json配置文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22- 这篇文章主要介绍了记一次EFCore类型转换错误及解决方案,帮助大家更好的理解和学习使用asp.net core,感兴趣的朋友可以了解下...2021-09-22
- 什么是SSO?单点登录SSO(Single Sign-On)是身份管理中的一部分。SSO的一种较为通俗的定义是:SSO是指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用中的受保护...2015-11-08
- 这篇文章主要介绍了vue项目中js-cookie的使用存储token操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-14
详解ASP.NET Core 中基于工厂的中间件激活的实现方法
这篇文章主要介绍了ASP.NET Core 中基于工厂的中间件激活的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-22- 什么是cookie? cookie 是存储于访问者的计算机中的变量。每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie。你可以使用 JavaScript 来创建和取回 cookie 的值。 有关cookie的例子: 名字 cookie 当访...2014-05-31
asp.net通过消息队列处理高并发请求(以抢小米手机为例)
这篇文章主要介绍了asp.net通过消息队列处理高并发请求(以抢小米手机为例),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22- Underscore 是一个 JavaScript 工具库,它提供了一整套函数式编程的实用功能,但是没有扩展任何 JavaScript 内置对象。这篇文章主要介绍了underscore源码分析相关知识,感兴趣的朋友一起学习吧...2016-01-02
ASP.NET单选按钮控件RadioButton常用属性和方法介绍
RadioButton又称单选按钮,其在工具箱中的图标为 ,单选按钮通常成组出现,用于提供两个或多个互斥选项,即在一组单选钮中只能选择一个...2021-09-22python爬虫用request库处理cookie的实例讲解
在本篇内容里小编给大家整理的是一篇关于python爬虫用request库处理cookie的实例讲解内容,有需要的朋友们可以学习参考下。...2021-02-21ASP.NET 2.0中的数据操作:使用两个DropDownList过滤的主/从报表
在前面的指南中我们研究了如何显示一个简单的主/从报表, 该报表使用DropDownList和GridView控件, DropDownList填充类别,GridView显示选定类别的产品. 这类报表用于显示具有...2016-05-19详解.NET Core 使用HttpClient SSL请求出错的解决办法
这篇文章主要介绍了.NET Core 使用HttpClient SSL请求出错的解决办法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2021-09-22ASP.NET中iframe框架点击左边页面链接 右边显示链接页面内容
这篇文章主要介绍了ASP.NET中iframe框架点击左边页面链接,右边显示链接页面内容的实现代码,感兴趣的小伙伴们可以参考一下...2021-09-22