1

我有一个像 Google+ 或 Facebook 这样的图片库,我想避免未经授权的人在以其他方式联系控制器 (../GetImage/test) 时显示图片。

图像保存在文件系统和数据库中图像的路径。

当图像是公开的或与用户共享时,用户只能显示图像。我想避免对控制器的请求(../GetImage/test)进行 SQL 查询(以检查用户是否可以显示图像),因为当我想加载 500 时,我认为这不是一个好习惯图像一次。

是否有更好的做法来检查用户是否有权显示图像?

4

1 回答 1

2

您需要构建您的数据模型,以便您对图像的请求包含与您的授权系统的连接,这样您就无法访问您无权访问的图像,并且它发生在单个查询中。

由于我不知道您的数据模型是如何构建的,所以我只能给您一个基本示例,并且我假设您正在使用 Entity Framework 进行数据访问。

public string GetImage(int id) {
    using (var db = new DataEntities()) {
        return imagePath = (from i in db.Images 
                        where i.AuthorizedUsers
                        .Any(x => x.UserName == User.Current.Name)
                        && i.id == id
                        select i.ImagePath).FirstOrDefault();
    }
}

当然,如果未经授权的用户拥有图像的 URL,这不会阻止未经授权的用户获取图像,因此您需要直接返回图像,而不仅仅是路径。

所以是这样的:

public ActionResult GetImage(string id) 
{ 
    // code from above

    var dir = Server.MapPath("imagePath"); 
    return base.File(path, "image/jpeg"); 
}
于 2012-04-06T16:41:46.490 回答