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认证

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zysfdp.html