博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
aspnetcore 认证相关类简要说明二
阅读量:5149 次
发布时间:2019-06-13

本文共 3394 字,大约阅读时间需要 11 分钟。

能过《》我们已经了解如何将AuthenticationOptions注入到我们依赖注入系统。接下来,我们将了解一下IAuthenticationSchemeProvider通过AuthenticationOptions如何提供AuthenticationScheme的。aspnetcore 中IAuthenticationSchemeProvider默认实现是AuthenticationSchemeProvider,我们简单的分析下它的源码(以下是我简化的源码):

public class AuthenticationSchemeProvider : IAuthenticationSchemeProvider     {
      private readonly IDictionary
_schemes;       ... public AuthenticationSchemeProvider(IOptions
options)      {
        foreach(var scheme in options.Schemes){
          var authenticationScheme=scheme.Build();           _schemes.Add(authenticationScheme.Name,authenticationScheme);         }      }      ... public virtual Task
GetSchemeAsync(string name)      {
        return Task.FromResult(_schemes[name]);      }      public virtual void AddScheme(AuthenticationScheme scheme);   }

还记得我们上篇文章中通过services.AddAuthentication注入AuthenticationOptions吗?在AuthenticationSchemeProvider构造方法中,将通过依赖注入系统将AuthenticationOptions传入给该类作为参数。在构造方法中,通过foreach options对象的Schemes属性Buid方法获得AuthenticationScheme,以它的Name属性作为_schemes字典的key,保存AuthenticationScheme到字典中。我们还可以通过AuthenticationSchemeProvider类的AddScheme添加认证方案。

 

接下来,我们继续看看IAuthenticationHandlerProvider类实现类AuthenticationHandlerProvider:

public class AuthenticationHandlerProvider : IAuthenticationHandlerProvider    {
public AuthenticationHandlerProvider(IAuthenticationSchemeProvider schemes) { Schemes = schemes; } public IAuthenticationSchemeProvider Schemes { get; } private Dictionary
_handlerMap = new Dictionary
(StringComparer.Ordinal); public async Task
GetHandlerAsync(HttpContext context, string authenticationScheme) { if (_handlerMap.ContainsKey(authenticationScheme)) { return _handlerMap[authenticationScheme]; } var scheme = await Schemes.GetSchemeAsync(authenticationScheme); ...        var handler = (context.RequestServices.GetService(scheme.HandlerType) ?? ActivatorUtilities.CreateInstance(context.RequestServices, scheme.HandlerType)) as IAuthenticationHandler; if (handler != null) { await handler.InitializeAsync(scheme, context); _handlerMap[authenticationScheme] = handler; } return handler; } }

该类实现还是比较简单的,通过构造方法,将IAuthenticationSchemeProvider注入进来,该类最重要的方法也是该类除了构造方法之外的唯一方法GetHandlerAsync。还记得我在上篇特别提醒注意AuthenticationOptions类的AddScheme<THandler>方法中THandler必须是IAuthenticationHandler接口类型吗?我们就是通过该类的GetHandlerAsync获取到我们在Startup的ConfigureServices注入的认证方案处理类型MyAuth类的实例。

既然讲到IAuthenticationHandler接口,我就简单复制一下该接口定义的方法代码放下面:

public interface IAuthenticationHandler    {
Task InitializeAsync(AuthenticationScheme scheme, HttpContext context); Task
AuthenticateAsync(); Task ChallengeAsync(AuthenticationProperties properties); Task ForbidAsync(AuthenticationProperties properties); }

关于该接口的第一个方法,我们在上一段代码有调用,就不解释了。既然是认证,整个认证过程中最重要的逻辑当然实现在IAuthenticationHandler的AuthenticateAsync方法中。

本篇主要讲AuthenticationSchemeProvider和IAuthenticationHandlerProvider,以及简单提了一下IAuthenticationHandler,明天我们继续讲IAuthenticationHandler的默认实现。

由于时间已经很晚了,本篇就到此结束。

转载于:https://www.cnblogs.com/koeltp/p/9880441.html

你可能感兴趣的文章
php本地及远程文件包含漏洞
查看>>
[asp.net]网页与服务器的交互模型
查看>>
19-template转render写法
查看>>
大道至简
查看>>
(转)Altera对应的时序概念
查看>>
使用IDM下载软件下载百度云网盘里的资源,以Chrome浏览器为例
查看>>
JDBC 调用存储过程代码示例
查看>>
一周冲刺计划2//第二天
查看>>
给flash添加A链接
查看>>
OEA 中 WPF 树型表格整体重构
查看>>
今天第一帖
查看>>
前端大牛的职业生涯建议 原文
查看>>
IP 地址分类
查看>>
国家地区域名
查看>>
2018/3/26 省选模拟赛 60分
查看>>
201521123060 《Java程序设计》第5周学习总结
查看>>
Linux驱动程序学习备忘之六
查看>>
使用 Unity(二):配置 Unity 、读取配置信息和获取对象
查看>>
导出数据库中所有的对象到指定的目录bcp xp_cmdshell
查看>>
LNMP环境搭建
查看>>