我有一个Global.asx文件,需要进行自定义身份验证,审核和分析。这是必需的,因为它支持基于SAML的SSO系统,需要覆盖正常的.Net身份验证(不支持SAML或混合身份验证)
我不想为静态文件触发它,例如.js
,.css
,.png
等
在Cassini / WebDev和IIS7中确实如此。
我想要的是一些简单的检查,比如this.Request.IsStaticFile
(不幸的是,它不存在)来识别静态文件。
我意识到写入起来相当简单,但感觉就像已经存在的东西一样 - IIS已经为静态文件应用了缓存策略等等。
我需要一个代码解决方案,而不是IIS配置更改一个。
更新
这是我目前的解决方法:
/// <summary>Hold all the extensions we treat as static</summary>
static HashSet<string> allowedExtensions = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
{
".js", ".css", ".png", ...
};
/// <summary>Is this a request for a static file?</summary>
/// <param name="request">The HTTP request instance to extend.</param>
/// <returns>True if the request is for a static file on disk, false otherwise.</returns>
public static bool IsStaticFile(this HttpRequest request)
{
string fileOnDisk = request.PhysicalPath;
if (string.IsNullOrEmpty(fileOnDisk))
{
return false;
}
string extension = Path.GetExtension(fileOnDisk);
return allowedExtensions.Contains(extension);
}
这很有效,而且速度很快,但感觉非常笨重。特别是如果我们添加未考虑的新静态文件,依赖于扩展将容易出错。
有没有更好的方法而不更改IIS配置?
答案 0 :(得分:0)
您可以检查哪个处理程序处理请求。
在IIS6中,只有.net文件,例如aspx被映射到执行操作的处理程序。
在带有集成管道的IIS7中,一切都通过.net路由,这通常是一件好事。不同的处理程序仍然处理不同的文件类型。特别是我相信staticfilehandler是你需要检查的。 httpcontext.handler
属性可以让你弄明白。
您可以创建一个扩展方法来添加该IsStatic方法......
西蒙
答案 1 :(得分:0)
有几个选择:
authorization
element并拒绝为空答案 2 :(得分:0)
毫无疑问,您需要创建自定义扩展方法,因为ASP.NET路由引擎使用此代码来确定文件是否存在,
if (!this.RouteExistingFiles)
{
string appRelativeCurrentExecutionFilePath = httpContext.Request.AppRelativeCurrentExecutionFilePath;
if (((appRelativeCurrentExecutionFilePath != "~/") && (this._vpp != null)) && (this._vpp.FileExists(appRelativeCurrentExecutionFilePath) || this._vpp.DirectoryExists(appRelativeCurrentExecutionFilePath)))
{
return null;
}
}
您无法使用context.handler在Application_BeginRequest中确定请求是否为静态,因为路由模块可能会更改处理程序,并且此模块始终在Application_BeginRequest之后执行。我的建议是使用ASP.NEt路由引擎使用的类似代码。