使用imageresizer和IVirtualImageProvider的Auhtentication和Authorization

时间:2016-06-30 10:41:26

标签: asp.net image-resizing imageresizer imageresizer-diskcache

我正在使用http://imageresizing.net/组件在我的网络应用程序上显示图像。

我的问题是,在检索图像之前,用户需要(表单)进行身份验证,尽管我允许匿名用户。

我通过实现接口创建了我自己的VirtualImageProvider和VirtualFile实现:

    public class CustomVirtualImageProvider : IVirtualImageProvider, IPlugin
{
    public bool FileExists(string virtualPath, NameValueCollection queryString)
    {
        return true;
    }

    public IVirtualFile GetFile(string virtualPath, NameValueCollection queryString)
    {
        var customVirtualFile = new CustomVirtualFile(virtualPath, queryString);

        return customVirtualFile;
    }

    public IPlugin Install(Config c)
    {
        c.Plugins.add_plugin(this);
        return this;
    }

    public bool Uninstall(Config c)
    {
        c.Plugins.remove_plugin(this);
        return true;
    }
}

    public class CustomVirtualFile : IVirtualFile
{
    private readonly string _virtualPath;

    public CustomVirtualFile(string virtualPath, NameValueCollection query)
    {
        _virtualPath = virtualPath;
        this.query = new ResizeSettings(query);
    }

    protected ResizeSettings query;

    public System.IO.Stream Open()
    {
        var pathService = new ICustomImagePathService();

        string path = pathService.GetPhysicalPathByVirtual(_virtualPath);

        var fi = new FileInfo(path);
        if (!fi.Exists)
        {
            return null;
        }

        CurrentLogger.Logger.Debug("Processing: " + _virtualPath);

        var ms = new MemoryStream();
        using (var file = new FileStream(path, FileMode.Open, FileAccess.Read))
        {
            var bytes = new byte[file.Length];
            file.Read(bytes, 0, (int)file.Length);
            ms.Write(bytes, 0, (int)file.Length);
        }

        ms.Seek(0, SeekOrigin.Begin);

        return ms;
    }

    public string VirtualPath { get { return _virtualPath; } }
}

在web.config中我设置了DiskCache插件:

<diskcache dir="/ImageCache" />

此/ ImageCache是​​IIS中的VirtualDirectory。

我正在使用asp.net FormsAuthentication。

要求是用户在从以下位置获取图片时需要进行身份验证: 的 https://myhost/i/userprofile/(guid)

允许未经身份验证的用户/请求从以下位置获取图像: 的 https://myhost/i/public/logos/(guid)

为实现这一目标,我在webapplication中创建了这些文件夹:

  • / I
  • / I /公共

在这些文件夹中,我添加了一个测试default.aspx页面和这些web.config:

/ I

<?xml version="1.0"?>
<configuration>
  <system.web>
    <authorization>
     <deny users="?"/>
    </authorization>
  </system.web>
</configuration>

/ I /公共

<?xml version="1.0"?>
<configuration>
  <system.web>
    <authorization>
      <allow users="?"/>
    </authorization>
  </system.web>
</configuration>

使用网页进行测试:

/i/default.aspx - &gt;重定向到登录页面。好。

/i/public/default.aspx - &gt;显示页面。好。

/i/userprofile/d39a2fe0-2f1d-9750-e8d4-ebbe0f87d790.jpg?w=50&h=50 - &gt;重定向到登录页面。好。

/i/public/applogo/297/3347df8d-ef47-4280-ac2d-75a740b5898e.jpg?w=100&h=100 - &gt;重定向到登录页面。 不好

有人可以帮我解决这个问题吗?我希望将最后一张图像显示给未经身份验证的用户。

非常感谢提前。

2 个答案:

答案 0 :(得分:0)

我认为您可能在这里错误地使用了URL授权。我认为 ”?”表示任何经过身份验证的用户,但“*”表示所有用户,包括未经身份验证的用户。

您可能还需要使用<location>元素来确保您的配置特定于某些网址。

您是否考虑过使用IIS URL授权而不是ASP.NET URL授权? https://www.iis.net/learn/manage/configuring-security/understanding-iis-url-authorization

答案 1 :(得分:0)

我通过进行以下更改来实现它:

1)将IUSR中的匿名身份验证凭据(在IIS中)更改为应用程序池标识

2)将runAllManagedModulesForAllRequests设置回&#34; true&#34;。在测试期间,我尝试禁用它。

全部使用ASP.NET Url授权。