aspnetcore 认证相关类简要说明二

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

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

      public virtual void AddScheme(AuthenticationScheme scheme);     }

还记得我们上篇文章中通过services.AddAuthentication注入AuthenticationOptions吗?在AuthenticationSchemeProvider构造方法中,将通过参数传入给该类的对象。在构造方法中,通过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<string, IAuthenticationHandler> _handlerMap = new Dictionary<string, IAuthenticationHandler>(StringComparer.Ordinal);

        public async Task<IAuthenticationHandler> 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获取到。

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

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

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

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

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

原文地址:https://www.cnblogs.com/koeltp/p/9880441.html

时间: 2024-10-31 02:14:01

aspnetcore 认证相关类简要说明二的相关文章

aspnetcore 认证相关类简要说明三

今天我们再来了解一个很重要的接口IAuthenticationService的实现类AuthenticationService: public class AuthenticationService : IAuthenticationService { public AuthenticationService(IAuthenticationSchemeProvider schemes, IAuthenticationHandlerProvider handlers, IClaimsTransfo

hive认证相关类分析

目前的hive版本是支持authentication和authorization的(再加上计费就是3A了,哈哈), 在hive的java.org.apache.hadoop.hive.conf.HiveConf类中定义的权限相关的设置项有: HIVE_AUTHORIZATION_ENABLED("hive.security.authorization.enabled", false),   //是否开启权限验证 HIVE_AUTHORIZATION_MANAGER("hive

Cordova Android源码分析系列二(CordovaWebView相关类分析)

本篇文章是Cordova Android源码分析系列文章的第二篇,主要分析CordovaWebView和CordovaWebViewClient类,通过分析代码可以知道Web网页加载的过程,错误出来,多线程处理等. CordovaWebView类分析 CordovaWebView类继承了Android WebView类,这是一个很自然的实现,共1000多行代码.包含了PluginManager pluginManager,BroadcastReceiver receiver,CordovaInt

&lt;转&gt;深入理解Activity启动流程(二)–Activity启动相关类的类图

本文原创作者:Cloud Chou. 出处:本文链接 本系列博客将详细阐述Activity的启动流程,这些博客基于Cm 10.1源码研究. 在介绍Activity的详细启动流程之前,先为大家介绍Activity启动时涉及到的类,这样大家可以有大概的了解,不至于在细节中迷失. 深入理解Activity启动流程(一)--Activity启动的概要流程 深入理解Activity启动流程(三)--Activity启动的详细流程1 深入理解Activity启动流程(三)--Activity启动的详细流程2

深入理解Activity启动流程(二)–Activity启动相关类的类图

本文原创作者:Cloud Chou. 欢迎转载,请注明出处和本文链接 本系列博客将详细阐述Activity的启动流程,这些博客基于Cm 10.1源码研究. 在介绍Activity的详细启动流程之前,先为大家介绍Activity启动时涉及到的类,这样大家可以有大概的了解,不至于在细节中迷失. 深入理解Activity启动流程(一)--Activity启动的概要流程 深入理解Activity启动流程(三)--Activity启动的详细流程1 深入理解Activity启动流程(三)--Activity

【Anroid】第9章 列表视图(1)--ListView相关类及其适配器

分类:C#.Android.VS2015: 创建日期:2016-02-18 一.简介 列表视图(ListView)是Android应用程序中使用最频繁的UI组件,从无处不在短菜单选项列表到冗长的联系人或internet收藏夹列表--都会用它来实现. ListView控件的用法非常灵活,既可以使用内置的视图呈现基本的样式,也可以用自定义视图呈现各种特殊的视觉效果. 要完全掌握Android提供的ListView控件的用法,需要解决下面的问题: (1)如何用Android内置的视图呈现列表视图中的每

Web---演示Servlet的相关类、下载技术、线程问题、自定义404页面

Servlet的其他相关类: ServletConfig – 代表Servlet的初始化配置参数. ServletContext – 代表整个Web项目. ServletRequest – 代表用户的请求. ServletResponse – 代表用户的响应. HttpSession – 代表用户的一次会话. 本篇博客演示:ServletConfig类 和 ServletContext 类(网页点击量统计,留言板和图片下载技术(其他类型文件类似)) ServletConfig: 它包含了Serv

Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关类 简介

Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- Android包 : android.net 包 (1接口, 19类, 3枚举, 1异常), android.net.http 包 (6类), android.net.nsd 包 (3接口, 2类), android.net.rtp (4类), android.net.sip 包 (1接口, 9类, 1

iOS开发RunLoop学习:三:Runloop相关类(source和Observer)

一:RunLoop相关类: 其中:source0指的是非基于端口por,说白了也就是处理触摸事件,selector事件,source1指的是基于端口的port:是处理系统的一些事件 注意:创建一个RunLoop之后,有默认的运行模式mode,也可以为RunLoop指定运行模式,RunLoop启动必须得有运行模式,而且在运行模式中必须还有timer或是source事件其中之一,否则RunLoop就会退出.启动RunLoop必须调用start方法 二:RunLoop运行处理逻辑 RunLoop通知观