0

我有这个:

[AllowAnonymous]
public FilePathResult GetImage(string user)
{
    var path = AppDomain.CurrentDomain.BaseDirectory + "files\\uploads\\users\\" + user + "\\avatar\\";
    var ext = this.GetImageExtension(path, user);
    return ext != null ? File(path + user + "." + ext, "image/" + ext, user + "." + ext) : File(AppDomain.CurrentDomain.BaseDirectory + "files\\commonFiles\\users\\avatar\\noavatar.png", "image/png", "noavatar.png");
}

在我的观点中,我有这个:

<img src="/MyAccount/GetImage/?user=@User.Identity.Name" 
     alt="@User.Identity.Name" />

现在,每当我在我的 Web 开发人员服务器中使用它时,它都可以正常工作。但是当我在我的服务器上发布我的网站时,它甚至没有尝试执行该操作。为什么?

4

1 回答 1

7

为什么?

因为您已将 url 硬编码到控制器操作,而不是使用 url 助手:

<img src="@Url.Action("GetImage", "MyAccount", new { user = User.Identity.Name })" alt="@User.Identity.Name" />

您永远不应该在 ASP.NET MVC 应用程序中硬编码 url,而应始终使用 url 帮助程序。

同样将当前登录的用户作为查询字符串参数传递看起来像一个可怕的安全问题。没有什么可以阻止用户传递他喜欢的任何用户名并查看该用户的图像。您应该在控制器操作中读取当前经过身份验证的用户。

所以首先摆脱这个查询字符串参数:

<img src="@Url.Action("GetImage", "MyAccount")" alt="@User.Identity.Name" />

然后在您的控制器操作中,您始终可以使用以下User.Identity.Name属性检索当前登录的用户:

[Authorize]
public FilePathResult GetImage()
{
    string user = User.Identity.Name;
    var path = Server.MapPath(
        string.Format("~/files/uploads/users/{0}/avatar/", user)
    );
    var ext = this.GetImageExtension(path, user);
    if (string.IsNullOrEmpty(ext))
    {
        return File(
            Server.MapPath("~/files/commonFiles/users/avatar/noavatar.png"), 
            "image/png", 
            "noavatar.png"
        );
    }
    var file = Path.ChangeExtension(Path.Combine(path, user), ext);
    return File(file, "image/" + ext, user + "." + ext);
}

我还用[Authorize]属性修饰了这个控制器动作,使它只有经过身份验证的用户可以访问。如果这不是您的情况,您仍然可以保留该[AllowAnonymous]属性,但User.Identity.IsAuthenticated在尝试访问他的用户名之前进行检查。

于 2013-02-02T18:16:41.407 回答