说道认证&授权其实这块才是核心,这款跟前面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. $使用dom4j可解析 返回&#x等字样的 html转义字符【转】

    如果以GET或POST请求某个系统返回,带有 $#x 那很有可能是axis服务器返回的. <?xml version="1.0" encoding="UTF-8&q ...

  2. Ubuntu 16.04下安装zsh和oh-my-zsh

    注意:安装前先备份/etc/passwd 一开始装oh-my-zsh我是拒绝的,因为这东西安装容易,卸载难,真的很难. Mac安装参考:http://www.cnblogs.com/EasonJim/ ...

  3. 找第二大的数SQL-Second Highest Salary

    1: 找小于最大的最大的 select max(Salary) from Employee where Salary<(select MAX(Salary) from Employee); 2. ...

  4. (转)MFC界面风格

    以前在XP写的程序,现在系统换成了WIN7,现在对话框在编辑和预览的时候显示都如图一所示,可实际编译生成之后的显示却如图二所示,是什么问题?如何设置两者的显示风格使其保持一致? ----------- ...

  5. Tomcat 配置目录

    TOMCAT 1.主目录下有bin,conf,lib,logs,temp,webapps,work 1.bin目录主要是用来存放tomcat的命令 2.conf目录主要是用来存放tomcat的一些配置 ...

  6. luogu P3522 [POI2011]TEM-Temperature

    这道题暴力做法就是枚举每个起点,然后向后拓展到不能拓展 就像这样(红框是每个位置的取值范围,绿线是你取的值构成的折线) 应该可以发现,左端点往右移的过程中,右端点也只能不动或往右移,所以我们可以每次移 ...

  7. if语句与switch语句

    if语句可以替代switch语句,但是switch语句不能完全替代if语句.比如下面这种就是不对的 switch (len) { case (len <= 4): domLen = 4; bre ...

  8. configure编译选项

    1.rpath与rpath-link的区别 参考链接:http://blog.csdn.net/xph23/article/details/38157491 rpath 是 运行时候链接的库, rpa ...

  9. Java读取Excel文件转换成JSON并转成List——(七)

    Jar包

  10. 生成eps图形

    (1) matlab可直接将生成图片保存为eps格式. print -fhandle -rresolution -dfileformat filename 例子:set(gcf,'paperposit ...