asp.net core 3.x 身份验证-2启动阶段的配置

注册服务、配置选项、添加身份验证方案

在Startup.ConfigureServices执行services.AddAuthentication()

注册如下服务(便于理解省略了部分辅助服务):

  • services.TryAddScoped<IAuthenticationService, AuthenticationService>();
  • services.TryAddScoped<IAuthenticationHandlerProvider, AuthenticationHandlerProvider>();
  • services.TryAddSingleton<IAuthenticationSchemeProvider, AuthenticationSchemeProvider>();

整个应用的身份验证有个选项对象叫AuthenticationOptions(上一篇有描述),允许我们对身份验证做整体配置,这个配置主要体现为:配置系统需要支持的身份验证方案列表;指定默认身份验证方案、默认登录时用的身份验证方案...默认注销...等。这个对象的应用使用asp.net core的选项模型,我们可以通过AddAuthentication(Action<AuthenticationOptions>)重载来进行配置。参考如下代码:

1 services.AddAuthentication(authenticationOptions=> {
2    authenticationOptions.AddScheme<CookieAuthenticationHandler>("cookie", "显示名cookie");
3    authenticationOptions.AddScheme<JwtBearerHandler>("jwt","显示名jwtToken");
4    authenticationOptions.DefaultAuthenticateScheme = "cookie";
5    //...其它配置
6 });

此重载同样会先注册上面的核心服务。然后设置初始化AuthenticationOptions的委托,当某个类注入AuthenticationOptions时,依赖注入框架会调用此委托来初始化这个选项对象。

另一个重载AddAuthentication(string defaultAuthenticateScheme)内部也是调用上面的方法,只是只设置了AuthenticationOptions.DefaultAuthenticateScheme

AddAuthentication方法始终返回AuthenticationBuilder,它允许我们通过链式调用方式来向AuthenticationOptions添加多个身份验证方案,所以更常见的方式如下:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie().AddJwtBearer();

CookieAuthenticationDefaults.AuthenticationScheme常来指明将哪个身份验证方案作为默认。后续分别添加了cookie和JwtBearer两个身份验证方案。

我们说AuthenticationOptions是针对整个应用程序的身份验证选项,可以简单理解为它是身份验证方案的配置时容器。针对特定身份验证方案也有自己的配置对象。以AddCookie()为例,它等同于:

 1 authenticationOptions.AddScheme<CookieAuthenticationHandler>(CookieAuthenticationDefaults.AuthenticationScheme, "显示名cookie",);
 2 service.Configre<CookieAuthenticationOptions>(options=>{
 4            options.Cookie.Name = CookieAuthenticationDefaults.CookiePrefix + name;
 6            options.CookieManager = new ChunkingCookieManager();
 7            options.LoginPath = CookieAuthenticationDefaults.LoginPath;
 8            options.LogoutPath = CookieAuthenticationDefaults.LogoutPath;
 9            options.AccessDeniedPath = CookieAuthenticationDefaults.AccessDeniedPath;
10       }
11 });

CookieAuthenticationOptions就是针对这个cookie身份验证方案的选项对象,将来某个类注入此选项对象时,依赖注入框架会回调此委托来初始化它。参考:选项模型。当然AddCookie有对应的重载允许我们自己的委托来初始化这个选项对象。类似下面的代码:

1 services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie("换个方案名","显示名",opt=> {
2       opt.SlidingExpiration = true;//滑动过期?
3       //设置其它跟cookie身份验证相关的东东...
4 }).AddJwtBearer();

现在看看这段代码就亲切多了。

插入身份验证中间件

上面只是注册了身份验证过程中需要的服务并配置了应用需要支持身份验证方案列表,在将来请求抵达时需要一个中间件来处理身份验证,核心任务是找到默认身份验证处理器,通过它从请求中获得当前用户标识,然后设置到httpContext.User属性上,至于处理的具体过程将在下一篇基于cookie的身份验证整体流程详细说。在Startup.Configre中通过扩展方法注册:

app.UseRouting();
app.UseAuthentication();
app.UseEndpoints(endpoints =>{
  endpoints.MapRazorPages();
});

至于为啥身份验证中间件一定要在 app.UseRouting(); 之后,我是真的想不通....

原文地址:https://www.cnblogs.com/jionsoft/p/12301179.html

时间: 2024-10-05 00:17:42

asp.net core 3.x 身份验证-2启动阶段的配置的相关文章

从头编写 asp.net core 2.0 web api 基础框架 (4) EF配置

原文:从头编写 asp.net core 2.0 web api 基础框架 (4) EF配置 第1部分:http://www.cnblogs.com/cgzl/p/7637250.html 第2部分:http://www.cnblogs.com/cgzl/p/7640077.html 第3部分:http://www.cnblogs.com/cgzl/p/7652413.html Github源码地址:https://github.com/solenovex/Building-asp.net-co

ASP.NET Core技术研究-探秘Host主机启动过程

原文:ASP.NET Core技术研究-探秘Host主机启动过程 当我们将原有ASP.NET 应用程序升级迁移到ASP.NET Core之后,我们发现代码工程中多了两个类Program类和Startup类. 接下来我们详细探秘一下通用主机Host的启动过程. 一.Program类的Main函数入口 Program类最重要的功能就是启动主机,这里有一个主机的概念,是ASP.NET Core全新引入的. 主机负责应用程序启动和生存期管理. 同时,主机也是封装应用程序资源的对象: 依赖注入 (DI)

asp.net core web api token验证和RestSharp访问

对与asp.net core web api验证,多种方式,本例子的方式采用的是李争的<微软开源跨平台移动开发实践>中的token验证方式. Asp.net core web api项目代码: 首先定义三个Token相关的类,一个Token实体类,一个TokenProvider类,一个TokenProviderOptions类 代码如下: /// <summary> /// Token实体 /// </summary> public class TokenEntity

ASP.NET MVC:窗体身份验证及角色权限管理示例

ASP.NET MVC 建立 ASP.NET 基础之上,很多 ASP.NET 的特性(如窗体身份验证.成员资格)在 MVC 中可以直接使用.本文旨在提供可参考的代码,不会涉及这方面太多理论的知识. 本文仅使用 ASP.NET 的窗体身份验证,不会使用它的 成员资格(Membership) 和 角色管理 (RoleManager),原因有二:一是不灵活,二是和 MVC 关系不太. 一.示例项目 User.cs 是模型文件,其中包含了 User 类: public class User { publ

ASP.NET WebAPI 安全与身份验证 基础验证与非对称加密

因为安全需要,又没有申请HTTPS证书 只对密码进行了非对称加密 同时服务端验证了是否有证书 本文参考了: MSDN 13年6月的期刊(启用和自定义 ASP.NET Web API 服务的安全性 ):https://msdn.microsoft.com/zh-cn/magazine/dn201748.aspx 与园子里(C#使用RSA证书文件加密和解密示例):http://www.cnblogs.com/eshizhan/archive/2012/10/07/2713680.html 根据实际使

ASP.NET 中通过Form身份验证 来模拟Windows 域服务身份验证的方法

This step-by-step article demonstrates how an ASP.NET   application can use Forms authentication to permit users to authenticate   against the Active Directory by using the Lightweight Directory Access Protocol   (LDAP). After the user is authenticat

ASP.NET域集成AD身份验证

预期效果 如果使用域用户登录操作系统,然后访问网站,无须登录,直接进入网站. 如果使用非域用户登录操作系统,然后访问网站,弹出登录页面. 解决方案 ASP.NET项目 使用三个页面来模拟这个过程:Default.aspx.Index.aspx.Login.aspx Default.aspx.cs中的代码: protected void Page_Load(object sender, EventArgs e) { if (!this.IsPostBack) { string fullName =

从零写一个Asp.net core手脚架(模型验证)

一个asp.net core项目,一定包含了各种的实体,在RESTful api里面,有很多的参数传递,不建立实体则大量的参数需要自定验证正确性,并且Action上面会写的密密麻麻的参数 在asp.net 2.0的时候,就推出了ModelState,顾名思义,这个是模型状态,用于验证实体对象的 如何模型验证 用法是在需要验证的地方打上继承了ValidationAttribute的特性,比如常见的RequiredAttribute,这个是验证对象是否存在 /// <summary> /// Ad

asp.net mvc 最简单身份验证 [Authorize]通过的标准

[Authorize] public ContentResult Index2() { return Content("验证通过了"); } 经常能够看到某个Controler下的Action通过这个标签进行登录权限状态的校验,否则该Action不执行.但是满足什么条件才能通过Authorize这个过滤器的校验呢?答案:↓ public WebApiApplication() { PostAuthenticateRequest += WebApiApplication_PostAuth