.NET Core 3.0中如何从IAuthorizationHandler返回授权数据?
当然可以实现类似.NET Framework里的功能!不过在.NET Core的授权体系里,AuthorizationHandlerContext并没有直接提供ViewData的访问入口——这是因为Core版本的授权系统和MVC上下文做了更彻底的解耦,设计上更通用。但我们可以借助**HttpContext.Items**来实现同样的效果,它是请求级别的临时存储,刚好适合传递这种授权相关的临时数据。
修改后的授权处理器代码
这里是调整后的ContextActionFilter实现,核心是把需要传递的对象存入HttpContext.Items:
public class ContextActionFilter : IAuthorizationRequirement, IAuthorizationHandler { public Task HandleAsync(AuthorizationHandlerContext context) { // 更安全的空值检查方式 if (context.User.Identity?.IsAuthenticated == true) { var username = context.User.Identity.Name; var objectToReturn = new ObjectToReturn() { SomeProperty = GetSomePropertyForUser(username) }; // 将授权数据存入HttpContext的Items集合 context.HttpContext.Items["objectToReturn"] = objectToReturn; } else { throw new NullReferenceException("用户身份信息为空"); } // 必须调用Succeed标记授权成功,否则请求会被拦截 context.Succeed(this); return Task.CompletedTask; } // 模拟你的业务数据获取方法 private string GetSomePropertyForUser(string username) { // 这里替换成你的实际业务逻辑 return $"用户{username}的专属授权数据"; } } // 你的授权数据模型类 public class ObjectToReturn { public string SomeProperty { get; set; } }
在控制器/视图中获取数据
之后你可以在控制器的Action里取出这个数据,甚至把它放到ViewData里供视图使用,和你原来的需求完全匹配:
public IActionResult Index() { // 安全地从HttpContext.Items中取出数据 if (HttpContext.Items.TryGetValue("objectToReturn", out var obj) && obj is ObjectToReturn authData) { // 放到ViewData里,和.NET Framework的用法一致 ViewData["objectToReturn"] = authData; // 也可以直接在控制器里使用这个数据做业务逻辑 } return View(); }
几个关键注意点
- 必须调用
context.Succeed(this):如果不标记授权成功,.NET Core的授权中间件会直接拒绝这个请求,后续的控制器代码根本不会执行。 HttpContext.Items的生命周期:它只在当前请求内有效,请求结束后就会被释放,完全符合授权数据的临时特性。- 优化建议:可以给
HttpContext写个扩展方法,用强类型的方式存取这个授权数据,避免使用"objectToReturn"这种魔法字符串,让代码更健壮。
内容的提问来源于stack exchange,提问作者Jessica
相关产品推荐
相关产品推荐

