aspnetcore 认证相关类简要说明三
今天我们再来了解一个很重要的接口IAuthenticationService的实现类AuthenticationService:
- public class AuthenticationService : IAuthenticationService
- {
- public AuthenticationService(IAuthenticationSchemeProvider schemes, IAuthenticationHandlerProvider handlers, IClaimsTransformation transform)
- {
- Schemes = schemes;
- Handlers = handlers;
- Transform = transform;
- }
- public IAuthenticationSchemeProvider Schemes { get; }
- public IAuthenticationHandlerProvider Handlers { get; }
- public IClaimsTransformation Transform { get; }
- public virtual async Task<AuthenticateResult> AuthenticateAsync(HttpContext context, string scheme)
- {
- if (scheme == null)
- {
- var defaultScheme = await Schemes.GetDefaultAuthenticateSchemeAsync();
- scheme = defaultScheme?.Name;
- if (scheme == null)
- {
- throw new InvalidOperationException($"No authenticationScheme was specified, and there was no DefaultAuthenticateScheme found.");
- }
- }
- var handler = await Handlers.GetHandlerAsync(context, scheme);
- if (handler == null)
- {
- throw await CreateMissingHandlerException(scheme);
- }
- var result = await handler.AuthenticateAsync();
- if (result != null && result.Succeeded)
- {
- var transformed = await Transform.TransformAsync(result.Principal);
- return AuthenticateResult.Success(new AuthenticationTicket(transformed, result.Properties, result.Ticket.AuthenticationScheme));
- }
- return result;
- }
- /// <summary>
- /// Challenge the specified authentication scheme.
- /// </summary>
- /// <param name="context">The <see cref="HttpContext"/>.</param>
- /// <param name="scheme">The name of the authentication scheme.</param>
- /// <param name="properties">The <see cref="AuthenticationProperties"/>.</param>
- /// <returns>A task.</returns>
- public virtual async Task ChallengeAsync(HttpContext context, string scheme, AuthenticationProperties properties)
- {
- if (scheme == null)
- {
- var defaultChallengeScheme = await Schemes.GetDefaultChallengeSchemeAsync();
- scheme = defaultChallengeScheme?.Name;
- if (scheme == null)
- {
- throw new InvalidOperationException($"No authenticationScheme was specified, and there was no DefaultChallengeScheme found.");
- }
- }
- var handler = await Handlers.GetHandlerAsync(context, scheme);
- if (handler == null)
- {
- throw await CreateMissingHandlerException(scheme);
- }
- await handler.ChallengeAsync(properties);
- }
- /// <summary>
- /// Forbid the specified authentication scheme.
- /// </summary>
- public virtual async Task ForbidAsync(HttpContext context, string scheme, AuthenticationProperties properties)
- {
- if (scheme == null)
- {
- var defaultForbidScheme = await Schemes.GetDefaultForbidSchemeAsync();
- scheme = defaultForbidScheme?.Name;
- ...
- }
- var handler = await Handlers.GetHandlerAsync(context, scheme);
...await handler.ForbidAsync(properties);- }
- /// <summary>
- /// Sign a principal in for the specified authentication scheme.
- /// </summary>
- public virtual async Task SignInAsync(HttpContext context, string scheme, ClaimsPrincipal principal, AuthenticationProperties properties)
- {
...
if (scheme == null)- {
- var defaultScheme = await Schemes.GetDefaultSignInSchemeAsync();
- scheme = defaultScheme?.Name;
- ...
- }
- var handler = await Handlers.GetHandlerAsync(context, scheme);
- ...
var signInHandler = handler as IAuthenticationSignInHandler;- ...
await signInHandler.SignInAsync(principal, properties);- }
- /// <summary>
- /// Sign out the specified authentication scheme.
- /// </summary>
- public virtual async Task SignOutAsync(HttpContext context, string scheme, AuthenticationProperties properties)
- {
- if (scheme == null)
- {
- var defaultScheme = await Schemes.GetDefaultSignOutSchemeAsync();
- scheme = defaultScheme?.Name;
- if (scheme == null)
- {
- throw new InvalidOperationException($"No authenticationScheme was specified, and there was no DefaultSignOutScheme found.");
- }
- }
- var handler = await Handlers.GetHandlerAsync(context, scheme);
- if (handler == null)
- {
- throw await CreateMissingSignOutHandlerException(scheme);
- }
- var signOutHandler = handler as IAuthenticationSignOutHandler;
- if (signOutHandler == null)
- {
- throw await CreateMismatchedSignOutHandlerException(scheme, handler);
- }
- await signOutHandler.SignOutAsync(properties);
- }
}
该类通过构造方法,将我们前两篇中讲到了IAuthenticationSchemeProvider和IAuthenticationHandlerProvider注入了进来,第三个参数不是很重要就飘过了。接下来我们看看它的这几个方法AuthenticateAsync、ChallengeAsync、ForbidAsync、SignInAsync和SignOutAsync等方法,他们的套路几乎都一样的,通过注入进来的两个接口的实例,最终获得到IAuthenticationHandler接口实例,并调用同名方法。
关于IAuthenticationService、IAuthenticationHandlerProvider和IAuthenticationSchemeProvider我们又是什么时候注入到服务容器里去的呢?它是在AuthenticationCoreServiceCollectionExtensions这个静态类中的AddAuthenticationCore扩展方法注入到容器中的,还有AuthenticationOptions也是在这里注入到依赖注入系统的容器中的:
- public static class AuthenticationCoreServiceCollectionExtensions
- {
- public static IServiceCollection AddAuthenticationCore(this IServiceCollection services)
- {
...- services.TryAddScoped<IAuthenticationService, AuthenticationService>();
- services.TryAddSingleton<IClaimsTransformation, NoopClaimsTransformation>(); // Can be replaced with scoped ones that use DbContext
- services.TryAddScoped<IAuthenticationHandlerProvider, AuthenticationHandlerProvider>();
- services.TryAddSingleton<IAuthenticationSchemeProvider, AuthenticationSchemeProvider>();
- return services;
- }
- public static IServiceCollection AddAuthenticationCore(this IServiceCollection services, Action<AuthenticationOptions> configureOptions) {
- ...
- services.AddAuthenticationCore();
- services.Configure(configureOptions);
- return services;
- }
- }
该扩展方法是在Startup的ConfigureServices方法调用的。这个就不贴代码了。
注入完以后呢?怎么使用呢?为了方便使用,aspnetcore为我们在外面又裹了一层,那就是AuthenticationHttpContextExtensions为HttpContext添加的扩展方法。我们可以在Controller如下调用:
- public class HomeController : Controller
- {
- public IActionResult Index()
- {
- var result = HttpContext.AuthenticateAsync();
- return View(result.Result);
- }
- }
至此认证相关的核心元素介绍完成,本篇到此结束。
aspnetcore 认证相关类简要说明三的更多相关文章
- aspnetcore 认证相关类简要说明二
能过<aspnetcore 认证相关类简要说明一>我们已经了解如何将AuthenticationOptions注入到我们依赖注入系统.接下来,我们将了解一下IAuthenticationS ...
- aspnetcore 认证相关类简要说明一
首先我想要简要说明是AuthenticationScheme类,每次看到Scheme这个单词我就感觉它是一个很高大上的单词,其实简单翻译过来就是认证方案的意思.既然一种方案,那我们就要知道这个方案的名 ...
- 4 Handler相关类——Live555源码阅读(一)基本组件类
这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. Handler相关类概述 处理程序相关类一共有三个,其没有派生继承关系,但是其有友元关系和使用关系 ...
- iOS开发RunLoop学习:三:Runloop相关类(source和Observer)
一:RunLoop相关类: 其中:source0指的是非基于端口por,说白了也就是处理触摸事件,selector事件,source1指的是基于端口的port:是处理系统的一些事件 注意:创建一个Ru ...
- Android随笔之——Android时间、日期相关类和方法
今天要讲的是Android里关于时间.日期相关类和方法.在Android中,跟时间.日期有关的类主要有Time.Calendar.Date三个类.而与日期格式化输出有关的DateFormat和Simp ...
- 21 BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调度相关类
21_BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调度相关类 BasicTaskScheduler基本任务调度器 BasicTaskScheduler基 ...
- MFC编程入门之十三(对话框:属性页对话框及相关类的介绍)
前面讲了模态对话框和非模态对话框,本节来将一种特殊的对话框--属性页对话框. 属性页对话框的分类 属性页对话框想必大家并不陌生,XP系统中桌面右键点属性,弹出的就是属性页对话框,它通过标签切换各个页面 ...
- android 6.0 SDK中删除HttpClient的相关类的解决方法
一.出现的情况 在eclipse或 android studio开发, 设置android SDK的编译版本为23时,且使用了httpClient相关类的库项目:如android-async-http ...
- Web---演示Servlet的相关类、下载技术、线程问题、自定义404页面
Servlet的其他相关类: ServletConfig – 代表Servlet的初始化配置参数. ServletContext – 代表整个Web项目. ServletRequest – 代表用户的 ...
随机推荐
- SVN linux 服务器端配置
一. SVN 简单介绍 Subversion(SVN) 是一个开源的版本号控制系統, 也就是说 Subversion 管理着随时间改变的数据. 这些数据放置在一个中央资料档案库 (repository ...
- TestNG学习地址分享
谨以此随笔来记录一个曾经学习TestNG的网站,供以后作为工具书查阅. 链接地址,点击此处.
- Json&XML比较
1.定义 1.1 XML定义 扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用 ...
- Types方法之isSameType-isSuperType-isSubType
4.isSameType() 方法 /** * Is t the same type as s? */ public boolean isSameType(Type t, Type s) { retu ...
- UTF8最好不要带BOM,附许多经典评论
UTF-8 不需要 BOM,尽管 Unicode 标准允许在 UTF-8 中使用 BOM.所以不含 BOM 的 UTF-8 才是标准形式,在 UTF-8 文件中放置 BOM 主要是微软的习惯(顺便提一 ...
- WPF中Expander与ListBox(ItemsControl)嵌套中的问题
1. 当ListBox放在Expander中时,为了要实现实时更新数据的效果,这里使用了 ObservableCollection类型来作为数据源, 初始的简单例子如下:只有一个ListBox xam ...
- *2.3.2_加入env
在验证平台中加入reference model.scoreboard等之前,思考一个问题:假设这些组件已经定义好了,那么在验证平台的什么位置对它们进行实例化呢?在top_tb中使用run_test进行 ...
- Java责任链模式
责任链模式 顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计 ...
- 推荐网站 explainshell.com
ls 显示指定目录下的文件和目录,默认为当前目录. -a 显示所有文件及目录 (ls内定将文件名或目录名称开头为"."的视为隐藏档,不会列出) -l 除文件名称外,亦将文件型态.权 ...
- Swift函数_外部参数名,
//1________________ /** *没使用外部参数名的函数 */ func inputScore(name:String,score1:Int,score2:Int) { } /** * ...