我正在设计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);
}
}
答案 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.com
在HttpContext.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.
}
。但问题是,它可以很容易伪造,因此根据您的需要,您可能必须实现更复杂的身份验证/授权逻辑