说道认证&授权其实这块才是核心,这款跟前面Security这块有者紧密的联系,当然 HttpAbstractions 不光是认证、授权、还包含其他Http服务和中间价

接下来先就认证这块结合前面的Security作一个补充说明

前面 AddCookie 、OpenIdConnect、Google、QQ 等等不过是添加的认证策略方式,他们实现的授权接口都来至于我们的HttpAbstractions模块中的Authentication

只不过前面封装了扩展,看上起好像有点绕,比如OpenIdConnect我们来看下

builder.AddRemoteScheme<OpenIdConnectOptions, OpenIdConnectHandler>(authenticationScheme, displayName, configureOptions);

我之前说了的OpenIdConnectHandler的重要性,这个其实只不过实现了HttpAbstractions 模块下 Authentication中的抽象模块中的类及认证接口服务提供实现,可以看到OpenIdConnet 添加的远程认证策略AddRemoteScheme,实际就是 HttpAbstractions 中Authentication中的IAuthenticationHandler接口处理以及先关IAuthenticationSignInHandler、IAuthenticationSignOutHandler的实现,包括在OpenIdConnect 或者 Cookies等里面调用的SignIn SginOut 等操作,而通过下面的代码来实现

await handler.SignInAsync(principal, properties);

这里有一些疑问就是hanlder 是什么呢?这里就是提到前面的 AddScheme中策略问题了,其实就是提供认证处理接口

public IAuthenticationHandlerProvider Handlers { get; }

说道这里,就需要提到软件设计中经常会用到的一个步骤,那就是 Build 、Provider 、Handler  看到这三个东西是不是很熟悉

接下来我们来看下 AuthenticationSchemeBuilder 中的 Build构建,构建的时候指定了HandlerType ,其实这里的 HandlerType就是在AddScheme中指定了具体处理方式,注意这里的指定方式需要继承IAuthenticationHandler,当然也是在这里去构建

public void AddScheme<THandler>(string name, string displayName) where THandler : IAuthenticationHandler
=> AddScheme(name, b =>
{
b.DisplayName = displayName;
b.HandlerType = typeof(THandler);
});

其实我们可以这样来描述,我们现在在ConfigureServices添加好自己授权服务,假定我们没有参数,结合之前的OpenIdConnect例子,AddAuthenticationCore 、AddAuthentication其实都是扩展方法而已,里面其实实现了

IAuthenticationService 、IAuthenticationHandlerProvider、IAuthenticationSchemeProvider等服务的注册,下面我们这样来写,这里的CustomHandler是我自定义的处理策略handlertype,当然这里需要实现接口IAuthenticationHandler,当然还可以实现签入、签出相关接口

services.AddAuthenticationCore(options =>
{
options.AddScheme<CustomHandler>("name", "displayname"); });
public class CustomHandler : IAuthenticationHandler
{
public Task<AuthenticateResult> AuthenticateAsync()
{
throw new NotImplementedException();
} public Task ChallengeAsync(AuthenticationProperties properties)
{
throw new NotImplementedException();
} public Task ForbidAsync(AuthenticationProperties properties)
{
throw new NotImplementedException();
} public Task InitializeAsync(AuthenticationScheme scheme, HttpContext context)
{
throw new NotImplementedException();
}
}

其实这里自己封装成一个类库其实就是类是AddOpenIdConnect这样的认证服务中间件了,比如我前面写的 AddCustom,然而你写了这些之后怎么来实现认证的呢?

这里就需要说到 UserAuthentication这个中间件了,下面我们来看下这个中间件处理什么? 其实说到这里就已经很清楚了,就是拿到认证服务提供,调用Handler处理认证,然后将认证信息写入到User中,下面就是AuthenticationMiddleware中间件要做的事情

 var handlers = context.RequestServices.GetRequiredService<IAuthenticationHandlerProvider>();
foreach (var scheme in await Schemes.GetRequestHandlerSchemesAsync())
{
var handler = await handlers.GetHandlerAsync(context, scheme.Name) as IAuthenticationRequestHandler;
if (handler != null && await handler.HandleRequestAsync())
{
return;
}
} var defaultAuthenticate = await Schemes.GetDefaultAuthenticateSchemeAsync();
if (defaultAuthenticate != null)
{
var result = await context.AuthenticateAsync(defaultAuthenticate.Name);
if (result?.Principal != null)
{
context.User = result.Principal;
}
} await _next(context);

通过这些文字,相信基本多这块有大志的了解了,希望能够帮助到大家

.NetCore源码阅读笔记系列之HttpAbstractions(五) Authentication的更多相关文章

  1. .NetCore源码阅读笔记系列之Security (一) Authentication & AddCookie

    如果你使用过.NetCore开发过程序,你会很清楚,在其中我们经常会用到一些如下的代码 services.AddAuthentication(options => { options.Defau ...

  2. .NetCore源码阅读笔记系列之Security (四) Authentication & AddJwtBearer

    接下来我们在来看下AddJwtBearer,这个与AddOpenIdConnect不太一样,后者是远程发起身份认证请求是一种主动发起式的,多用于web等客户端,验证发生在身份认证服务端,而前者是一种被 ...

  3. .NetCore源码阅读笔记系列之Security (三) Authentication & AddOpenIdConnect

    通过第二篇文章我们已经知道了授权的内部实现通过自定义的授权Handler来的,同样的道理 OpenIdConnect 同样是通过 OpenIdConnectHandler来请求授权的 那么它内部又是怎 ...

  4. .NetCore源码阅读笔记系列之Security (二) 自定义认证实践

    通过前面对AddCookie 或者 AddOpenIdConnect 等了解,其实里面都实现了一个AuthenticationHandler<TOptions>的认证处理,接下来我们来简单 ...

  5. Yii源码阅读笔记(三十五)

    Container,用于动态地创建.注入依赖单元,映射依赖关系等功能,减少了许多代码量,降低代码耦合程度,提高项目的可维护性. namespace yii\di; use ReflectionClas ...

  6. Yii源码阅读笔记(二十五)

    Module类中剩余部分代码,通过控制器ID实例化当前模块的控制器,当前模块的Action方法的前置和后置方法: /** * This method is invoked right before a ...

  7. CI框架源码阅读笔记5 基准测试 BenchMark.php

    上一篇博客(CI框架源码阅读笔记4 引导文件CodeIgniter.php)中,我们已经看到:CI中核心流程的核心功能都是由不同的组件来完成的.这些组件类似于一个一个单独的模块,不同的模块完成不同的功 ...

  8. CI框架源码阅读笔记4 引导文件CodeIgniter.php

    到了这里,终于进入CI框架的核心了.既然是“引导”文件,那么就是对用户的请求.参数等做相应的导向,让用户请求和数据流按照正确的线路各就各位.例如,用户的请求url: http://you.host.c ...

  9. CI框架源码阅读笔记3 全局函数Common.php

    从本篇开始,将深入CI框架的内部,一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说,全局函数具有最高的加载优先权,因此大多数的框架中BootStrap ...

随机推荐

  1. Dapper总结(二)---事务和存储过程

    一  dapper使用事务 string sql1 = "insert into UserInfo values('user8',27,'s')"; string sql2 = & ...

  2. JVM锁简介:偏向锁、轻量级锁和重量级锁

    转自:https://www.aimoon.site/blog/2018/05/21/biased-locking/ 比较复杂,简略见另一篇:https://www.cnblogs.com/twohe ...

  3. 第三节:工厂+反射+配置文件(手写IOC)对缓存进行管理。

    一. 章前小节 在前面的两个章节,我们运用依赖倒置原则,分别对 System.Web.Caching.Cache和 System.Runtime.Cacheing两类缓存进行了封装,并形成了ICach ...

  4. MyBatis全局配置文件MyBatis-config.xml代码

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC ...

  5. Unity3d跨平台原理

    知乎的一个提问:unity3d跨平台原理 一些资料: IL IL是.NET框架中中间语言(Intermediate Language)的缩写.使用.NET框架提供的编译器可以直接将源程序编译为.exe ...

  6. 用Emacs的这些年

    读技术博客时发现又有人提起我曾写的那篇口水文章 为何Emacs和Vim被称为两大神器.写那篇文章时,我还在Vim和Emacs之间摇摆.当然主要在用vim,博士学位论文和所有的国际会议文章都是用Vim编 ...

  7. (一)求 int 型数据在内存中存储时 1 的个数

    题目:求 int 型数据在内存中存储时 1 的个数 描述:输入一个 int 型数据,计算出该 int 型数据在内存中存储时 1 的个数 运行时间限制: 10 sec 内存限制:128 MByte 输入 ...

  8. 工控安全入门之Ethernet/IP

    这一篇依然是协议层面的,协议层面会翻译三篇,下一篇是电力系统中用的比较多的DNP3.这一篇中大部分引用的资料都可以访问到,只有一篇reversemode.com上的writeup(http://rev ...

  9. Bleve代码阅读(二)——Index Mapping

    引言 Bleve是Golang实现的一个全文检索库,类似Lucene之于Java.在这里通过阅读其代码,来学习如何使用及定制检索功能.也是为了通过阅读代码,学习在具体环境下Golang的一些使用方式. ...

  10. 啊金学习javascript系列一之javascript整体印象

    javascript是一门编程语言,这个是第一个观点.是编程语言,那就拥有编程语言的功能.在我理解之中,编程语言是和计算机打交道的语言,就是我们跟计算机说话用的语言,是用来指挥计算机的.人类能够理解语 ...