【发布时间】:2019-02-06 22:46:37
【问题描述】:
我想阻止直接访问视图。当单击用户电子邮件中的确认链接时,我有一个显示已确认电子邮件的视图。但是,问题是该视图的Url可以直接访问,我只是希望在单击电子邮件中的链接时访问它。
我已尝试过此选项,但由于 UrlReferer 在 Asp.net 核心中不可用,因此一直出错。此代码在 asp.net core 中不起作用,请有人帮助我。
如何在 ASp.net Core 2.x 中访问这些值:
filterContext.HttpContext.Request.UrlReferrer
filterContext.HttpContext.Request.Url.Host
filterContext.HttpContext.Request.UrlReferrer.Host
我在 Stack-overflow 上找到的代码 - 但它需要 System.Web,这在 asp.net 核心中不可用。
public class NoDirectAccessAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.HttpContext.Request.UrlReferrer == null ||
filterContext.HttpContext.Request.Url.Host != filterContext.HttpContext.Request.UrlReferrer.Host)
{
filterContext.Result = new RedirectToRouteResult(new
RouteValueDictionary(new { controller = "Home", action = "Index", area = "" }));
}
}
}
推荐使用自定义属性的方式
[NoDirectAccess]
public ActionResult MyActionMethod()
【问题讨论】:
-
我试过这个但总是返回 null - 我需要从 ActionExecutingContext string referer = context.HttpContext.Request.Headers["Referer"].ToString();
-
@LyoidLopes 可能您需要重构它的验证方式。
UrlReferer很容易通过。另外,如果用户已经确认了邮件,但是通过在浏览器中直接粘贴 URL 两次来访问视图,您如何确定是否应该显示该视图? IMO,如果用户已确认电子邮件,只需将EmailConfrimed=true存储在某处(数据库/JWT/...)。现在您可以使用过滤器/策略来防止直接访问视图 -
我正在尝试,但要阻止用户再次预览,我需要获取 UrlReferer。如果这很容易,你能给我一个过滤器的例子。当他们单击电子邮件链接时会显示视图。但是当他们复制粘贴相同的链接时,仍然可以看到电子邮件确认消息。我只想要一个过滤器来防止直接访问 url。但为此我需要 System.Web - 我不能在 Asp.net 核心中使用它 - 因此,如何在过滤器中获取 UrlReferer 的值。
标签: asp.net asp.net-core