我正在设计2个网站(localhost:44300
和localhost:44301
)。第一个上传图像,第二个将图像存储为图像托管。
在第二个网站的家庭控制器中,我已宣布:
[HttpPost]
public ActionResult UploadImages()
{
//logic...
}
第一个网站上的脚本:
$.ajax({
url: 'https://localhost:44301/Home/UploadImages',
type: 'POST'
}).done(function (data) {
//logic...
})
这很好,但是:如果有localhost:44301
的请求未由localhost:44300
(其他网站)发送,会发生什么?
UploadImages()
方法仍然接受该请求并继续上传。
我想到account
。但是如何从localhost登录到另一个localhost呢?我无法将username
和password
放入ajax。攻击者很容易阅读。
我有两个问题:
如果我在这种情况下使用帐户,这样好吗?如果没有,你能给我一些提示吗?
谢谢!
答案 0 :(得分:1)
实际问题是处理在不特别允许内部访问和拒绝外部访问的应用程序之间处理服务器到服务器的身份验证。
在OP和JB King之间看到上面的讨论。我真正建议的是您使用Azure Blob Storage或Amazon S3存储。然后,您可以在应用程序之间轻松读取或写入二进制数据。
另一种选择只是使用常规的表单身份验证,但是您有site1将用户名和密码发布到登录操作,并在响应中返回auth cookie。您需要保留auth cookie并将其泵入从site1到site2的任何出站请求。
旧答案:
如果您要对请求是否为本地执行授权,您希望实现自定义AuthorizeAttribute
它看起来类似于
public class LocalOnlyAuth : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (false == filterContext.RequestContext.HttpContext.Request.IsLocal)
{
filterContext.Result =
new HttpStatusCodeResult(HttpStatusCode.Forbidden, "Origin is forbidden");
}
}
}
你会申请
[LocalOnlyAuth]
public class HomeController : Controller
答案 1 :(得分:1)
如果我是你,我会:
通过这种方式,您将拥有一个只能从LAN共享中的服务器1更新的只读图像服务器。
如果这不适用(您不想将任何内容上传到server1),请查看Load Balancing + Authentication这样的问题(Does Forms Authentication work with Web Load Balancers?)。这样您也可以将服务器扩展到1 + 1以上。
答案 2 :(得分:1)
我找到了解决方案。这很容易:
检查
Request.Url.AbsoluteUri
如果AbsoluteUri以......开头(来自...),那么它应该是一个有效的请求。
示例:
if (Request.Url.AbsoluteUri.StartsWith("https://localhost:44300/"))
{
//logic...
}
或特定域名:
if (Request.Url.AbsoluteUri.StartsWith("https://site1.com/"))
{
//logic...
}