在asp.net mvc中请求验证

时间:2016-01-01 19:28:45

标签: asp.net-mvc

我正在设计2个网站。第一个上传图像,第二个将图像存储为图像托管(两者都使用asp.net mvc 5)。

第一个网站的域名是:vinachannel.com

在第一个网站中,我想通过ajax将一些图像发送到托管:

var f = new FormData();
$.ajax({
   url: 'https://myimagehosting.com/home/upload',
   type: 'POST',
   data: f,
   processData: false,
   contentType: false
}).done(function (data) {
   // logic...
})

托管的Upload控制器中的操作Home

[HttpPost]
public JsonResult Upload()
{
   if (Request.Files.Count > 0)
   {
      // start uploading...
   }
}

现在,我的问题是:我想图像托管只接受从vinachannel.com发送的请求。就像:

[HttpPost]
public JsonResult Upload()
{
   if (Request.Files.Count > 0 && Request.Url.AbsoluteUri.StartsWith("vinachannel.com"))
   {
      // start uploading...
   }
}

或使用正则表达式:

var reg = new Regex(@"^(https://)?(www\.)?(vinachannel\.com)(.+)$");
if (Request.Files.Count > 0 && reg.IsMatch(Request.Url.AbsoluteUri))
{
   // start uploading...
}

我的问题:如何自定义属性以验证所有操作请求Upload

[VinaChannel] // only requests from site vinachannel.com
[HttpPost]
public JsonResult Upload()
{
   // ...
}

更新(基于@David的评论并跟随the article

public class VinaChannelFilter : ActionFilterAttribute, IActionFilter
{
    void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
    {
        var reg = new Regex(@"^(https://)?(www\.)?(vinachannel\.com)(.+)$");
        if (reg.IsMatch(HttpContext.Current.Request.Url.AbsoluteUri))
        {
           // what's next here...?
        }
        this.OnActionExecuting(filterContext);
    }
}

2 个答案:

答案 0 :(得分:2)

您可以创建一个自定义操作过滤器,用于检查请求标头并查看请求的来源,并使用该值来确定是否允许/拒绝进一步处理。 Referer标题是您可能想要使用的标题。

public class VerifyDomain : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var expectedHost = "domainnameyouwanttocheck";
        var headers = filterContext.HttpContext.Request.Headers;

        if (!String.IsNullOrEmpty(headers["Referer"]) 
                                      && new Uri(headers["Referer"]).Host == expectedHost)
        {
            base.OnActionExecuting(filterContext);
        }
        else
        {
            filterContext.Result = new HttpUnauthorizedResult();
        }           
    }
}

使用动作过滤器

装饰你的动作方法/控制器
[VerifyDomain]
[HttpPost]
public ActionResult Upload()
{
  // to do : return something
}

当从expectedHost变量中的值以外的任何位置访问此端点时,调用者将获得401 Unauthorized响应。您可以更新if条件以检查expectedHost名称列表以支持您的本地开发环境。

答案 1 :(得分:1)

myimagehosting.comHttpContext.Current.Request.Url.AbsoluteUri,对吗?然后,myimagehosting.com将返回HttpContext.Current.Request.UrlReferrer.AbsolutePath域上的Uri,以获取您需要获得引荐来源的源地址:TextBox1.KeyPress += new KeyPressEventHandler(TextBox1_KeyPress); void TextBox1_KeyPress(object sender, KeyPressEventArgs e) { //do your check here. } 。但问题是,它可以很容易伪造,因此根据您的需要,您可能必须实现更复杂的身份验证/授权逻辑