Web.config 允许特定用户访问位置
Posted
技术标签:
【中文标题】Web.config 允许特定用户访问位置【英文标题】:Web.config allow location access for specific user 【发布时间】:2012-04-16 23:01:24 【问题描述】:我有一个网络服务器,用户可以从中下载每个用户的特定文件。为确保每个用户只能下载自己的文件,他们必须通过 Basic-Authentication 进行身份验证。因此,对于每个用户,服务器上都有一个 Windows 帐户,该帐户具有对用户特定文件夹的读取权限。
现在我想将此功能移至另一台服务器。我不想为用户创建 Windows 帐户,但仍保留基本身份验证。所以我将Custom Basic Authentication HTTP Module 与Custom MembershipProvider 结合使用,让我可以在web.config 中定义用户。
身份验证工作得很好,但是在使用jack
或jill
登录后(参见web.config),我可以访问Dir1
和Dir2
这两个位置。如果我将位置标签中的<allow users="jack" />
部分注释掉,也会出现这种情况。
附加信息: 我创建了一个 Default.aspx 文件并添加了一个
<% Response.Write(HTTPContext.Current.User.Identity.Name) %>
根据登录者返回正确的用户名。
<% Response.Write(HTTPContext.Current.User.Identity.IsAuthenticated) %>
返回 True。
我该怎么做才能只有jack
能够访问(=从Dir1
下载文件)并且只有jill
能够访问(=从Dir2
下载文件但不能反过来呢?
编辑:我尝试为每个子目录添加 web.config 文件,而不是 utkai 提到的位置标签 - 结果相同。每个用户都可以访问任何目录。
这是我的 Web.config 文件:
<configuration>
<system.webServer>
<modules>
<add name="CustomBasicAuthentication" type="LeastPrivilege.CustomBasicAuthentication.CustomBasicAuthenticationModule, LeastPrivilege.CustomBasicAuthenticationModule, Version=1.0.0.0, Culture=neutral, PublicKeyToken=F20DC168DFD54966"/>
</modules>
<security>
<authentication>
<customBasicAuthentication enabled="true" realm="TEST" providerName="AspNetWebConfigMembershipProvider" cachingEnabled="true" cachingDuration="15" requireSSL="false"/>
</authentication>
<authorization>
<deny users="?" />
</authorization>
</security>
</system.webServer>
<system.web>
<membership defaultProvider="AspNetWebConfigMembershipProvider">
<providers>
<add name="AspNetWebConfigMembershipProvider" type="LeastPrivilege.AspNetSecurity.Samples.WebConfigMembershipProvider, WebConfigMembershipProvider"/>
</providers>
</membership>
<authentication mode="Forms">
<forms>
<credentials passwordFormat="Clear">
<user name="jack" password="jack"/>
<user name="jill" password="jill"/>
</credentials>
</forms>
</authentication>
<authorization>
<deny users="?" />
</authorization>
</system.web>
<location path="Dir1" allowOverride="false">
<system.web>
<authorization>
<!-- <allow users="jack" /> -->
<deny users="*" />
</authorization>
</system.web>
</location>
<location path="Dir2" allowOverride="false">
<system.web>
<authorization>
<!-- <allow users="jill" /> -->
<deny users="*" />
</authorization>
</system.web>
</location>
</configuration>
【问题讨论】:
我的研究工作需要一些时间。很快就会更新你。 我可以同时访问 Dir1 和 Dir2 您是否在 Web 服务器 IIS 中启用了目录浏览功能? 不,我没有启用目录浏览。我的意思是我可以查看/下载这些目录中包含的文件,无论用户登录的是什么。 你有download
的链接还是直接输入url
?
我只是在地址栏中输入http://localhost/Dir1/jack.txt
之类的内容以进行测试。它有什么不同?
【参考方案1】:
这是一篇好文章的链接,其中详细介绍了几种情况,人们希望允许/拒绝访问特定页面或文件夹:
Setting authorization rules for a particular page or folder in web.config
作为旁注,在我们做的一个项目中,我们使用每个文件夹中单独的 web.config 文件的选项,如链接中所述,它对我们来说很好。
希望它有助于解决您的问题。
【讨论】:
感谢您的回答。我像你说的那样为子目录添加了单独的 web.config 文件。但问题是一样的。每个用户仍然可以访问每个子目录。【参考方案2】:这种方法类似但不同 - 位置是文件而不是目录:
Is it possible to allow anonymous user to browse only few files from a folder
【讨论】:
【参考方案3】:使用此分步指南将标记应用于 Web.config 文件以配置对特定文件和文件夹的访问。
<location path="default1.aspx">
<system.web>
<authorization>
<allow users ="*" />
</authorization>
</system.web>
</location>
<!-- This section gives the unauthenticated user access to all of the files that are stored in the Subdir1 folder. -->
<location path="subdir1">
<system.web>
<authorization>
<allow users="Admin" />
</authorization>
</system.web>
</location>
More info...
【讨论】:
【参考方案4】:更新 #3
您可以启用 URLAuthorization 以强制 IIS 保护通常不在 IIS 中处理的文件。此处的解决方案取决于 IIS 7.x 并使用集成管道。
<system.webServer>
<modules>
<add name="FormsAuthenticationModule" type="System.Web.Security.FormsAuthenticationModule" />
<remove name="UrlAuthorization" />
<add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" />
<remove name="DefaultAuthentication" />
<add name="DefaultAuthentication" type="System.Web.Security.DefaultAuthenticationModule" />
</modules>
</system.webServer>
更新 #2 您只能通过删除您添加的自定义内容并执行以下操作来完全切换到表单身份验证。
我已经对此进行了实际测试,它只允许 jack 进入 dir1 和 dir2 中的 jill。两者都可以访问根目录。
如果这不起作用,我们将需要讨论您的更多设置。
web.config
<?xml version="1.0"?>
<configuration>
<system.webServer>
<modules>
<add name="FormsAuthenticationModule" type="System.Web.Security.FormsAuthenticationModule" />
<remove name="UrlAuthorization" />
<add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" />
<remove name="DefaultAuthentication" />
<add name="DefaultAuthentication" type="System.Web.Security.DefaultAuthenticationModule" />
</modules>
</system.webServer>
<system.web>
<authentication mode="Forms">
<forms loginUrl="Login.aspx" defaultUrl="Default.aspx">
<credentials passwordFormat="Clear">
<user name="jack" password="jack" />
<user name="jill" password="jill" />
</credentials>
</forms>
</authentication>
<authorization>
<deny users="?"/>
</authorization>
<compilation debug="true"></compilation>
<customErrors mode="Off"/>
</system.web>
<location path="dir1">
<system.web>
<authorization>
<allow users="jack" />
<deny users="*, ?" />
</authorization>
</system.web>
</location>
<location path="dir2">
<system.web>
<authorization>
<allow users="jill" />
<deny users="*, ?" />
</authorization>
</system.web>
</location>
</configuration>
Login.aspx - 您必须从 Login 控件添加重定向,否则 Forms 身份验证将在 App_Code 目录中查找不存在的数据库。
<asp:Login ID="Login1" runat="server" OnAuthenticate="Login1_Authenticate">
</asp:Login>
Login.aspx.cs
protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
string username = Login1.UserName;
string password = Login1.Password;
if (FormsAuthentication.Authenticate(username, password))
FormsAuthentication.RedirectFromLoginPage(username, false);
更新 #1
我浏览了您链接为自定义基本身份验证 HTTP 模块的示例,然后转到 The HTTP Module,它在底部有一个指向其他源的链接。
此来源有一个使用自定义基本身份验证的成员资格提供程序示例。我觉得您在 web.config 中混合使用 Forms 成员资格提供程序时遇到了麻烦。
当您开始进行自己的单独身份验证时,事情并不顺利,您通常需要添加自己的所有内容。
此代码适用于我这边的附加链接。
另外一种可能性是,如果您想让 ASP.NET 自己处理所有成员资格并且您使用 SQL 来存储所有内容,请考虑查看 http://weblogs.asp.net/sukumarraju/archive/2009/10/02/installing-asp-net-membership-services-database-in-sql-server-expreess.aspx 以了解如何使用向导来设置它SQL。
内置的成员资格将是表单身份验证,并且比使用自定义的工作量要少得多。
以前的版本
我从来没有使用过<location>
标签,所以我只是将新的 web.configs 放在目录中。当我不在子文件夹中排除匿名时,我也遇到了麻烦。这似乎是浏览器将默认为匿名,这将通过
这是我的做法。
根 web.config
<system.web>
<authorization>
<allow roles="AccessRole1, AccessRole2" users="domain\jack, domain\jill"/>
<deny users="*, ?" /> <!-- make sure you deny anonymous with '?' -->
</authorization>
</system.web>
子目录 web.config。确保您明确拒绝所有其他用户。如果您不拒绝所有其他用户,他们仍然可以进入。
<?xml version="1.0"?>
<configuration>
<system.web>
<authorization>
<allow users="domain\jill" />
<deny users="*, ?"/> <!-- explicitly deny all others, including anonymous -->
</authorization>
</system.web>
</configuration>
【讨论】:
我没有角色或域用户。我也尝试排除匿名用户,但我仍然遇到同样的问题。我认为问题可能出在自定义 MembershipProvider 和/或 CustomAuthentication 的某个地方。 您能提供您的会员/验证码的详细信息吗?我过去创建了几个简单的,可能会有所帮助。 正如问题中提到的,我使用了来自这里的 MembershipProvider:leastprivilege.com/…,扩展名为 leastprivilege.com/…,并结合了 HTTP 模块。请让我知道您需要什么信息。谢谢 糟糕,我错过了。我会试着复习一下,看看我能不能看到发生了什么 我使用了 MembershipProvider (Forms),所以我可以在 web.config 而不是 SQL 数据库中定义用户。但在这种情况下,我会尝试。你知道任何其他 MembershipProvider 可以让我在 web.config 中定义用户吗?【参考方案5】:在您的Web.config
中设置以下内容
<modules runAllManagedModulesForAllRequests="false">
将以下事件放入您的 Global.asax
文件中。
protected void Application_BeginRequest(Object sender, EventArgs e)
现在只要你像下面这样输入 URl。
http://localhost/dir1/jack.txt
控件将始终移动到Application_BeginRequest
事件。您有Request.Url
信息和Current User information
,您可以在此处进行验证。
使用下面的代码
throw new HttpException(403,"Acess Denied");
或者用一些用户友好的信息将用户发送到另一个页面。
【讨论】:
以上是关于Web.config 允许特定用户访问位置的主要内容,如果未能解决你的问题,请参考以下文章
文件夹中的 web.config 允许全部或不进行用户身份验证
IIS不能与web.config上的“位置路径代码”一起使用