.NET 6中NoDirectAccessAttribute是否变更?Url属性报错如何解决
问题根源
你使用的代码是传统.NET Framework平台下ASP.NET MVC的实现,无法直接在ASP.NET Core(.NET 6属于该技术栈)中运行。两个版本的Web框架对HttpRequest请求对象的API设计做了破坏性调整,不存在Url、UrlReferrer这两个属性,因此会触发编译错误,IDE也无法给出using补全类的修复建议——这不是NoDirectActionAttribute的逻辑有版本变更,是底层请求对象的属性完全改名、换了用法。
新旧API对应关系
- 旧版
Request.Url:用来获取当前请求的完整URL对象,Core版本中可直接通过Request.Host属性拿到当前请求的主机信息,无需解析完整URL - 旧版
Request.UrlReferrer:用来获取请求来源地址,Core版本中来源地址存储在Request.Headers["Referer"]请求头中,需要自行转换为Uri对象解析
.NET 6 可用的完整实现
首先引入必要的命名空间:
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.AspNetCore.Routing;
修正后的特性代码:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] internal class NoDirectActionAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { var request = filterContext.HttpContext.Request; // 解析来源请求头 var refererHeader = request.Headers["Referer"].ToString(); if (!Uri.TryCreate(refererHeader, UriKind.Absolute, out var referrerUri)) { // 无有效来源,跳转至首页 filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Home", action = "Index", area = string.Empty })); return; } // 比对当前请求与来源请求的主机 if (!string.Equals(referrerUri.Host, request.Host.Host, StringComparison.OrdinalIgnoreCase)) { filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Home", action = "Index", area = string.Empty })); } } }
额外说明
Referer请求头可被客户端篡改、禁用,该实现仅能拦截普通用户直接在地址栏输入URL访问的场景,不能作为严格的权限校验方案。受限页面的访问控制请优先使用ASP.NET Core内置的认证、授权中间件实现。- 如果你的项目使用Razor Pages或Minimal API,跳转路由的参数需要对应调整为项目实际的路由配置。
内容的提问来源于stack exchange,提问作者user19111040
相关产品推荐
相关产品推荐

