今天我们再来了解一个很重要的接口IAuthenticationService的实现类AuthenticationService:

  1. public class AuthenticationService : IAuthenticationService
  2. {
  3. public AuthenticationService(IAuthenticationSchemeProvider schemes, IAuthenticationHandlerProvider handlers, IClaimsTransformation transform)
  4. {
  5. Schemes = schemes;
  6. Handlers = handlers;
  7. Transform = transform;
  8. }
  9.  
  10. public IAuthenticationSchemeProvider Schemes { get; }
  11. public IAuthenticationHandlerProvider Handlers { get; }
  12. public IClaimsTransformation Transform { get; }
  13.  
  14. public virtual async Task<AuthenticateResult> AuthenticateAsync(HttpContext context, string scheme)
  15. {
  16. if (scheme == null)
  17. {
  18. var defaultScheme = await Schemes.GetDefaultAuthenticateSchemeAsync();
  19. scheme = defaultScheme?.Name;
  20. if (scheme == null)
  21. {
  22. throw new InvalidOperationException($"No authenticationScheme was specified, and there was no DefaultAuthenticateScheme found.");
  23. }
  24. }
  25.  
  26. var handler = await Handlers.GetHandlerAsync(context, scheme);
  27. if (handler == null)
  28. {
  29. throw await CreateMissingHandlerException(scheme);
  30. }
  31.  
  32. var result = await handler.AuthenticateAsync();
  33. if (result != null && result.Succeeded)
  34. {
  35. var transformed = await Transform.TransformAsync(result.Principal);
  36. return AuthenticateResult.Success(new AuthenticationTicket(transformed, result.Properties, result.Ticket.AuthenticationScheme));
  37. }
  38. return result;
  39. }
  40.  
  41. /// <summary>
  42. /// Challenge the specified authentication scheme.
  43. /// </summary>
  44. /// <param name="context">The <see cref="HttpContext"/>.</param>
  45. /// <param name="scheme">The name of the authentication scheme.</param>
  46. /// <param name="properties">The <see cref="AuthenticationProperties"/>.</param>
  47. /// <returns>A task.</returns>
  48. public virtual async Task ChallengeAsync(HttpContext context, string scheme, AuthenticationProperties properties)
  49. {
  50. if (scheme == null)
  51. {
  52. var defaultChallengeScheme = await Schemes.GetDefaultChallengeSchemeAsync();
  53. scheme = defaultChallengeScheme?.Name;
  54. if (scheme == null)
  55. {
  56. throw new InvalidOperationException($"No authenticationScheme was specified, and there was no DefaultChallengeScheme found.");
  57. }
  58. }
  59.  
  60. var handler = await Handlers.GetHandlerAsync(context, scheme);
  61. if (handler == null)
  62. {
  63. throw await CreateMissingHandlerException(scheme);
  64. }
  65.  
  66. await handler.ChallengeAsync(properties);
  67. }
  68.  
  69. /// <summary>
  70. /// Forbid the specified authentication scheme.
  71. /// </summary>
  72. public virtual async Task ForbidAsync(HttpContext context, string scheme, AuthenticationProperties properties)
  73. {
  74. if (scheme == null)
  75. {
  76. var defaultForbidScheme = await Schemes.GetDefaultForbidSchemeAsync();
  77. scheme = defaultForbidScheme?.Name;
  78. ...
  79. }
  80.  
  81. var handler = await Handlers.GetHandlerAsync(context, scheme);
           ...await handler.ForbidAsync(properties);
  82. }
  83.  
  84. /// <summary>
  85. /// Sign a principal in for the specified authentication scheme.
  86. /// </summary>
  87. public virtual async Task SignInAsync(HttpContext context, string scheme, ClaimsPrincipal principal, AuthenticationProperties properties)
  88. {
           ...
           if (scheme == null)
  89. {
  90. var defaultScheme = await Schemes.GetDefaultSignInSchemeAsync();
  91. scheme = defaultScheme?.Name;
  92. ...
  93. }
  94.  
  95. var handler = await Handlers.GetHandlerAsync(context, scheme);
  96. ...
           var signInHandler = handler as IAuthenticationSignInHandler;
  97. ...
           await signInHandler.SignInAsync(principal, properties);
  98. }
  99.  
  100. /// <summary>
  101. /// Sign out the specified authentication scheme.
  102. /// </summary>
  103. public virtual async Task SignOutAsync(HttpContext context, string scheme, AuthenticationProperties properties)
  104. {
  105. if (scheme == null)
  106. {
  107. var defaultScheme = await Schemes.GetDefaultSignOutSchemeAsync();
  108. scheme = defaultScheme?.Name;
  109. if (scheme == null)
  110. {
  111. throw new InvalidOperationException($"No authenticationScheme was specified, and there was no DefaultSignOutScheme found.");
  112. }
  113. }
  114.  
  115. var handler = await Handlers.GetHandlerAsync(context, scheme);
  116. if (handler == null)
  117. {
  118. throw await CreateMissingSignOutHandlerException(scheme);
  119. }
  120.  
  121. var signOutHandler = handler as IAuthenticationSignOutHandler;
  122. if (signOutHandler == null)
  123. {
  124. throw await CreateMismatchedSignOutHandlerException(scheme, handler);
  125. }
  126.  
  127. await signOutHandler.SignOutAsync(properties);
  128. }
    }

该类通过构造方法,将我们前两篇中讲到了IAuthenticationSchemeProvider和IAuthenticationHandlerProvider注入了进来,第三个参数不是很重要就飘过了。接下来我们看看它的这几个方法AuthenticateAsync、ChallengeAsync、ForbidAsync、SignInAsync和SignOutAsync等方法,他们的套路几乎都一样的,通过注入进来的两个接口的实例,最终获得到IAuthenticationHandler接口实例,并调用同名方法。

关于IAuthenticationService、IAuthenticationHandlerProvider和IAuthenticationSchemeProvider我们又是什么时候注入到服务容器里去的呢?它是在AuthenticationCoreServiceCollectionExtensions这个静态类中的AddAuthenticationCore扩展方法注入到容器中的,还有AuthenticationOptions也是在这里注入到依赖注入系统的容器中的:

  1. public static class AuthenticationCoreServiceCollectionExtensions
  2. {
  3. public static IServiceCollection AddAuthenticationCore(this IServiceCollection services)
  4. {
           ...
  5. services.TryAddScoped<IAuthenticationService, AuthenticationService>();
  6. services.TryAddSingleton<IClaimsTransformation, NoopClaimsTransformation>(); // Can be replaced with scoped ones that use DbContext
  7. services.TryAddScoped<IAuthenticationHandlerProvider, AuthenticationHandlerProvider>();
  8. services.TryAddSingleton<IAuthenticationSchemeProvider, AuthenticationSchemeProvider>();
  9. return services;
  10. }
  11.  
  12. public static IServiceCollection AddAuthenticationCore(this IServiceCollection services, Action<AuthenticationOptions> configureOptions) {
  13. ...
  14. services.AddAuthenticationCore();
  15. services.Configure(configureOptions);
  16. return services;
  17. }
  18. }

该扩展方法是在Startup的ConfigureServices方法调用的。这个就不贴代码了。

注入完以后呢?怎么使用呢?为了方便使用,aspnetcore为我们在外面又裹了一层,那就是AuthenticationHttpContextExtensions为HttpContext添加的扩展方法。我们可以在Controller如下调用:

  1. public class HomeController : Controller
  2. {
  3. public IActionResult Index()
  4. {
  5. var result = HttpContext.AuthenticateAsync();
  6. return View(result.Result);
  7. }
  8. }

至此认证相关的核心元素介绍完成,本篇到此结束。

aspnetcore 认证相关类简要说明三的更多相关文章

  1. aspnetcore 认证相关类简要说明二

    能过<aspnetcore 认证相关类简要说明一>我们已经了解如何将AuthenticationOptions注入到我们依赖注入系统.接下来,我们将了解一下IAuthenticationS ...

  2. aspnetcore 认证相关类简要说明一

    首先我想要简要说明是AuthenticationScheme类,每次看到Scheme这个单词我就感觉它是一个很高大上的单词,其实简单翻译过来就是认证方案的意思.既然一种方案,那我们就要知道这个方案的名 ...

  3. 4 Handler相关类——Live555源码阅读(一)基本组件类

    这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. Handler相关类概述 处理程序相关类一共有三个,其没有派生继承关系,但是其有友元关系和使用关系 ...

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

    一:RunLoop相关类: 其中:source0指的是非基于端口por,说白了也就是处理触摸事件,selector事件,source1指的是基于端口的port:是处理系统的一些事件 注意:创建一个Ru ...

  5. Android随笔之——Android时间、日期相关类和方法

    今天要讲的是Android里关于时间.日期相关类和方法.在Android中,跟时间.日期有关的类主要有Time.Calendar.Date三个类.而与日期格式化输出有关的DateFormat和Simp ...

  6. 21 BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调度相关类

    21_BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调度相关类 BasicTaskScheduler基本任务调度器 BasicTaskScheduler基 ...

  7. MFC编程入门之十三(对话框:属性页对话框及相关类的介绍)

    前面讲了模态对话框和非模态对话框,本节来将一种特殊的对话框--属性页对话框. 属性页对话框的分类 属性页对话框想必大家并不陌生,XP系统中桌面右键点属性,弹出的就是属性页对话框,它通过标签切换各个页面 ...

  8. android 6.0 SDK中删除HttpClient的相关类的解决方法

    一.出现的情况 在eclipse或 android studio开发, 设置android SDK的编译版本为23时,且使用了httpClient相关类的库项目:如android-async-http ...

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

    Servlet的其他相关类: ServletConfig – 代表Servlet的初始化配置参数. ServletContext – 代表整个Web项目. ServletRequest – 代表用户的 ...

随机推荐

  1. SVN linux 服务器端配置

    一. SVN 简单介绍 Subversion(SVN) 是一个开源的版本号控制系統, 也就是说 Subversion 管理着随时间改变的数据. 这些数据放置在一个中央资料档案库 (repository ...

  2. TestNG学习地址分享

    谨以此随笔来记录一个曾经学习TestNG的网站,供以后作为工具书查阅. 链接地址,点击此处.

  3. Json&XML比较

    1.定义 1.1 XML定义 扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用 ...

  4. Types方法之isSameType-isSuperType-isSubType

    4.isSameType() 方法 /** * Is t the same type as s? */ public boolean isSameType(Type t, Type s) { retu ...

  5. UTF8最好不要带BOM,附许多经典评论

    UTF-8 不需要 BOM,尽管 Unicode 标准允许在 UTF-8 中使用 BOM.所以不含 BOM 的 UTF-8 才是标准形式,在 UTF-8 文件中放置 BOM 主要是微软的习惯(顺便提一 ...

  6. WPF中Expander与ListBox(ItemsControl)嵌套中的问题

    1. 当ListBox放在Expander中时,为了要实现实时更新数据的效果,这里使用了 ObservableCollection类型来作为数据源, 初始的简单例子如下:只有一个ListBox xam ...

  7. *2.3.2_加入env

    在验证平台中加入reference model.scoreboard等之前,思考一个问题:假设这些组件已经定义好了,那么在验证平台的什么位置对它们进行实例化呢?在top_tb中使用run_test进行 ...

  8. Java责任链模式

    责任链模式 顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计 ...

  9. 推荐网站 explainshell.com

    ls 显示指定目录下的文件和目录,默认为当前目录. -a 显示所有文件及目录 (ls内定将文件名或目录名称开头为"."的视为隐藏档,不会列出) -l 除文件名称外,亦将文件型态.权 ...

  10. Swift函数_外部参数名,

    //1________________ /** *没使用外部参数名的函数 */ func inputScore(name:String,score1:Int,score2:Int) { } /** * ...