自定义AuthorizeAttribute的OnAuthorization方法中Account对象来源咨询
问题解答
这个Account对象是在当前请求流程中,比这个自定义AuthorizeAttribute更早执行的组件(中间件/过滤器)写入到HttpContext.Items中的。HttpContext.Items是ASP.NET Core中用于单个请求生命周期内共享临时数据的容器,只有前置逻辑先完成写入,后续的授权过滤器才能读取到对应数据。
常见的写入场景有以下几种:
- 自定义认证中间件:项目里大概率存在一个自定义认证中间件,它会在请求进入授权流程前,从请求的Token、Cookie或其他身份凭证中解析出用户信息,实例化成
Account对象后存入HttpContext.Items。比如类似这样的伪代码:
public async Task InvokeAsync(HttpContext context) { // 从请求头获取Token并解析 var authHeader = context.Request.Headers["Authorization"].FirstOrDefault(); if (!string.IsNullOrEmpty(authHeader) && authHeader.StartsWith("Bearer ")) { var token = authHeader.Substring(7); var account = YourTokenParser.Parse(token); // 自定义的Token解析逻辑 context.Items["Account"] = account; } // 继续执行后续中间件(包括授权过滤器) await _next(context); }
这个中间件需要在Startup.cs或Program.cs中注册在授权中间件(app.UseAuthorization())之前,才能保证授权时数据已存在。
前置的全局过滤器:如果项目注册了全局的Action过滤器或资源过滤器,这些过滤器的执行时机早于
AuthorizeAttribute的OnAuthorization方法,它们可以在自身逻辑中完成用户身份解析并写入HttpContext.Items。路由匹配后的自定义逻辑:部分项目会在路由匹配完成后,根据请求的特定参数或标识生成
Account对象,并存入Items供后续流程使用。
另外需要注意:这种实现属于自定义身份认证方案,没有使用ASP.NET Core自带的ClaimsPrincipal(即context.HttpContext.User)体系,而是用HttpContext.Items传递用户身份信息,是一种轻量但非标准的实现方式。
内容的提问来源于stack exchange,提问作者Janciu
相关产品推荐
相关产品推荐

