如何告诉ASP.NET窗体身份验证不验证某些文件扩展名?

时间:2010-07-29 22:17:47

标签: asp.net forms-authentication wildcard

我在II6上有一个asp.net 2.0(.net3.5)网站。 它设置为使用表单身份验证。 我已将“aspnet_isapi.dll”设置为IIS中“通配符应用程序映射”中的条目,因此所有请求都将通过asp.net。 在web.config中,我通过以下设置禁止所有匿名用户:

<system.web>
    <authorization>
        <deny users="?"/>
    </authorization>
    ...
</system.web>

我想这样做,以便具有特定扩展名的文件(特别是图像文件,如.gif,.jpg)不需要进行身份验证。 这些文件位于不同的文件夹中,因此只允许使用图像文件夹。

我修改了自己的Forms Authentication HttpModule来忽略所有这样的请求并返回。但是因为它忽略了这些文件而没有创建Principal,所以请求仍然是匿名的,并且会出现身份验证错误。

理想情况下,如果我可以执行以下任何一项操作会很棒,但它看起来不像是可以做到的事情:

1)当我们在IIS中设置通配符映射时,允许我们排除某些文件扩展名。

2)在我自己的Forms Authentication HttpModule中,我可以告诉asp.net停止此文件的asp.net处理pipleline,或者只是停止对它进行身份验证。

3)允许我们在web.config中location标签的path属性中使用通配符,例如:

<location path="*.jpg>
    <authorization>
        <allow users="?"/>
    </authorization`>
</system.web`>

我能想到的唯一解决方案是在IIS中删除通配符映射并单独添加应用程序扩展映射,因此并非所有请求都可以由asp.net处理。但是,我冒着丢失某些文件类型的风险,更不用说为所有已知文件类型(减去图像文件)单独添加它会很繁琐

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

创建通用的经过身份验证的主体

Public Class BlowByAuthenticatedIdentity
    Implements IIdentity

    Public ReadOnly Property AuthenticationType() As String Implements System.Security.Principal.IIdentity.AuthenticationType
        Get
            Return "BlowBy"
        End Get
    End Property

    Public ReadOnly Property IsAuthenticated() As Boolean Implements System.Security.Principal.IIdentity.IsAuthenticated
        Get
            Return True
        End Get
    End Property

    Public ReadOnly Property Name() As String Implements System.Security.Principal.IIdentity.Name
        Get
            Return String.Empty
        End Get
    End Property
End Class
Global.asax Application_AuthenticateRequest

中的

If Request.Path.ToLower.EndsWith(".jpg") Then
   Me.Context.User = BlowByAuthenticatedIdentity
End if

答案 1 :(得分:0)

也许您可以尝试使用httpHandlers部分来命名要排除的扩展名

<system.web>
    <httpHandlers>
        <add verb="*" path="*.mdb" type="System.Web.HttpForbiddenHandler" />
        <add verb="*" path="*.csv" type="System.Web.HttpForbiddenHandler" />
        <add verb="*" path="*.private" type="System.Web.HttpForbiddenHandler" />
    </httpHandlers> 
</system.web>

然后创建自己的httpHandler来处理用户请求的文件。

您可以在此处阅读更多内容 - http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q307985#2a

这只是我对你问题的看法。

谢谢, 附庸风雅