Asp.Net Core:IAuthorizationFilter 和 Authentication Service 的执行顺序

Posted

技术标签:

【中文标题】Asp.Net Core:IAuthorizationFilter 和 Authentication Service 的执行顺序【英文标题】:Asp.Net Core: order of execution of IAuthorizationFilter and Authentication Service 【发布时间】:2018-08-13 00:43:16 【问题描述】:

我正在 Asp.Net Core Web Api 应用程序中实现身份验证和授权机制。

我使用 JWT 进行用户身份验证:

ConfigureServices(IServiceCollection services)

...
services.AddAuthentication(...).AddJwtBearer(...)
...

(类似于https://***.com/a/45901894/1544054)

此服务还根据 JWT 数据填充 HttpContext.User。

对于授权,我使用自定义 RBAC 实现,基于

class AccessControlFilter :  IAuthorizationFilter

    public AccessControlFilter(string permission) ...
    public void OnAuthorization (AuthorizationFilterContext context)...

(类似于https://***.com/a/41348219 中的最佳答案)

我需要确定我的 AccessControlFilter 将在 JWT 身份验证服务之后运行,以便 context.HttpContext.User 已填充。

(我猜顺序是正确的,过滤器会在服务后运行,但我找不到正确的文档。)

【问题讨论】:

【参考方案1】:

来自ASP.NET Core Security Overview(强调我的):

身份验证与授权

身份验证是用户提供凭据的过程,然后将凭据与存储在操作系统、数据库、应用程序或资源中的凭据进行比较。如果它们匹配,则用户身份验证成功,然后可以在授权过程中执行他们被授权的操作。授权是指确定允许用户做什么的过程。

另一种理解身份验证的方式是将其视为进入空间的一种方式,例如服务器、数据库、应用程序或资源,而授权是用户可以执行的操作执行该空间内的哪些对象(服务器、数据库或应用程序)。

所以回答您的问题:身份验证总是发生在授权管道之前。这是有道理的,因为在知道用户有权做什么之前,您需要知道用户是谁。

【讨论】:

我找到了一篇更好的文章:过滤器在中间件之后运行(请参阅docs.microsoft.com/en-us/aspnet/core/mvc/controllers/filters)我会接受你的回答,因为你的文章让我找到了准确的答案。

以上是关于Asp.Net Core:IAuthorizationFilter 和 Authentication Service 的执行顺序的主要内容,如果未能解决你的问题,请参考以下文章

Asp.NET Core进阶 第四篇 Asp.Net Core Blazor框架

.NET Core 1.0ASP.NET Core 1.0和EF Core 1.0简介

asp.net core 注入后仍然报错?

深入研究 Mini ASP.NET Core(迷你 ASP.NET Core),看看 ASP.NET Core 内部到底是如何运行的

.Net Core 学习 - ASP.NET Core 概念学习

ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 14. ASP.NET Core Identity 入门