我正在Asp.Net Core Web Api应用程序中实现身份验证和授权机制。
我使用JWT进行用户身份验证配置:
ConfigureServices(IServiceCollection services)
{
...
services.AddAuthentication(...).AddJwtBearer(...)
...
}
(类似于https://stackoverflow.com/a/45901894/1544054)
此服务还根据JWT数据填充HttpContext.User。
对于授权,我使用基于的自定义RBAC实现
class AccessControlFilter : IAuthorizationFilter
{
public AccessControlFilter(string permission) {...}
public void OnAuthorization (AuthorizationFilterContext context){...}
}
(类似于https://stackoverflow.com/a/41348219的好答案)
我需要确定我的AccessControlFilter将在JWT身份验证服务之后运行,以便已经填充了context.HttpContext.User。
(我猜订单是正确的,过滤器将在服务后运行,但我找不到合适的文档。)
来自ASP.NET Core Security Overview(强调我的):
身份验证与授权
身份验证是用户提供凭据然后与存储在操作系统,数据库,应用程序或资源中的凭据进行比较的过程。如果它们匹配,则用户成功进行身份验证,然后可以在授权过程中执行他们授权的操作。授权是指确定允许用户执行操作的过程。
考虑身份验证的另一种方法是将其视为进入空间的一种方式,例如服务器,数据库,应用程序或资源,而授权是用户可以对该空间内的哪些对象执行的操作(服务器,数据库或应用程序)。
所以回答你的问题:身份验证总是在授权管道之前发生。这是有道理的,因为在知道用户的权限之前,您需要知道用户是谁。