我正在使用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中创建了这些文件夹:
在这些文件夹中,我添加了一个测试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;重定向到登录页面。 不好。
有人可以帮我解决这个问题吗?我希望将最后一张图像显示给未经身份验证的用户。
非常感谢提前。
答案 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授权。