Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 窗体身份验证:对子目录有不同的凭据吗?_C#_.net_Asp.net_Forms Authentication - Fatal编程技术网

C# 窗体身份验证:对子目录有不同的凭据吗?

C# 窗体身份验证:对子目录有不同的凭据吗?,c#,.net,asp.net,forms-authentication,C#,.net,Asp.net,Forms Authentication,我的网站有表单认证,一切都很好。现在我想创建一个子目录,并对其进行密码保护,但是我需要子目录使用与整个网站完全不同的登录/密码集 例如,我将网站的用户存储在数据库的“users”表中。但是对于子目录,我希望从“subrusers”表中获取用户。它可能有一个完全不同的结构 因此,我需要登录完全并行,如: 登录到整个网站并不会使您也登录到子目录 在整个网站上单击“注销”不会使您在子目录中的登录无效 反之亦然 我不想为子目录创建单独的虚拟应用程序,因为我想共享所有库、用户控件以及应用程序状态和缓存。换

我的网站有表单认证,一切都很好。现在我想创建一个子目录,并对其进行密码保护,但是我需要子目录使用与整个网站完全不同的登录/密码集

例如,我将网站的用户存储在数据库的“users”表中。但是对于子目录,我希望从“subrusers”表中获取用户。它可能有一个完全不同的结构

因此,我需要登录完全并行,如:

  • 登录到整个网站并不会使您也登录到子目录
  • 在整个网站上单击“注销”不会使您在子目录中的登录无效
  • 反之亦然
  • 我不想为子目录创建单独的虚拟应用程序,因为我想共享所有库、用户控件以及应用程序状态和缓存。换句话说,它必须是同一个应用程序

    我也不想只在“Users”表中添加一个标志,指示这是整个网站用户还是子目录用户。用户列表必须来自不同的来源

    目前,我看到的唯一选择是为子目录滚动我自己的表单Auth


    任何人都可以提出更好的替代方案?

    仅通过FormsAuthentication无法实现这一点

    这个问题场景非常适合使用HttpModules。HttpModules可以拦截请求和响应管道。您将需要编写2个HttpModules

  • 用于身份验证的HttpModule
  • http授权模块
  • 一旦您的解决方案达到稳定状态,并且您完全能够管理复杂性,您就可以将这些模块合并为一个模块

    在您的解决方案中,您需要有一个数据库机制来存储子目录和用户授权和身份验证映射数据。您的HttpModules可以读取这些数据,并对请求用户作出决定


    您可以从

    开始,我认为您可以使用此代码向任何提供者验证用户

    if (Membership.Providers["myprovider"].ValidateUser("USER", "PWD")) {
    
      //your code
    
    }
    

    子文件夹中可以有一个单独的web.config文件,该文件仅包含该子文件夹的有效性设置。请注意,您必须删除所有其他设置,因为有些设置只能在应用程序级别

    <authorization configSource="alterativeSource.xml"/>
    

    如果您的用户在web.config文件中,我可以看到一个更好的答案,但是由于您在数据库中使用用户,因此除了表单身份验证之外,您还必须使用其他方法。您需要将子目录设置为允许任何用户,然后基本上使用会话重建表单身份验证。您可以创建page类的子类,并使用它保存所有例程以进行身份验证和重定向。这样,您就不需要在子目录中的每个页面中添加任何内容

    我知道这是您可能希望避免的答案,但是表单身份验证对于这种复杂的情况来说太简单了。

    通常在登录后使用“授权”来确定给定用户可以使用哪些目录、资源等

    您是否考虑过为“main”目录创建一个角色,为“sub”目录创建第二个角色,然后应用授权标记(即在web.config中)?您将需要实现一个授权提供程序,但这听起来可能是一个比拥有多个用户表更好的长期解决方案

    澄清无论授权如何(即凭证检查或密码等),您仍然需要在某个位置定义用户角色,因此为了便于讨论,让我们假设一个“用户表”。(如果您愿意,没有什么可以阻止它成为独立存储中的XML文件。) NB实际上,用户来自不同的来源并不重要。这应该反映在用户表的模式中(即标志或其他列等)。如果你与这种常见的模式抗争,从长远来看,你可能会做更多的工作


    如果有一个例外,将来可能会有另一个例外……

    这可以帮助您-

    我没有尝试过,但我认为它会起作用

    您可以有两个成员资格提供程序(即ASPNETDB_1和ASPNETDB_2)

    这些在web.config的成员资格提供程序部分中指定。因此,在每个子目录中都需要一个单独的web.config,我知道您可以这样做

    在网站的根目录中,我想你不会有表单认证。您可以有一个起始页,要求用户选择哪个子目录(或者您可以只使用子域(firstdir.mysite.com、secondir.mysite.com)或http:/mysite.com/firstdirectory或http:/mysite.com/seconddirectory)

    不过,我不确定这种方法相对于虚拟目录的优势,只是根目录可以包含一些不需要身份验证的ASP程序

    我知道您正在寻找“开箱即用”的解决方案,不想“自己动手”。但是,标准成员资格提供程序确实允许您为每个用户建立一个配置文件,这样就很容易为每个单独的用户维护功能设置一个带有列表视图的用户维护窗体,并按角色或配置文件值(例如,组织ID)进行筛选.使用成员资格提供程序类,我个人发现这非常容易做到(如果使用所有拖放控件、SqlDatasource+listview,则可能需要一个小时来创建维护表单——不需要VB或C编码)。但是,单独的提供程序和网络配置也可以做到这一点。

    您不能在不在应用程序级别的web.config中使用标记。但是您可以使用
    标记,这是用于定义用户的标记。对不起,我的意思是
    。请参阅我更新的an