2

我正在一个有内部和外部部分的网站上工作。

这两个部分的用户不同,因此他们需要不同的登录页面。我想为这两个文件夹配置不同的身份验证,但是 ASP.Net 但不允许这样做。

示例(在我的主 web.config 中):

<authentication mode="Forms">
    <forms loginUrl="~/Pages/Internal/Main.aspx" defaultUrl="~/Pages/Internal/Main.aspx" cookieless="UseDeviceProfile" name=".ApplicationAuthenticatedUser" path="/" protection="All" slidingExpiration="true" timeout="45"/>
</authentication>

在外部子文件夹中,我尝试覆盖设置:

<authentication mode="Forms">
    <forms loginUrl="~/Pages/External/Default.aspx" defaultUrl="~/Pages/External/Default.aspx" cookieless="UseDeviceProfile" name=".ApplicationAuthenticatedUser" path="/Pages/External" protection="All" slidingExpiration="true" timeout="45"/>
</authentication>

然而,这给了我一个错误。

我尝试将它们都放在它们的子文件夹中,但我得到了同样的错误,身份验证配置部分必须在应用程序级别设置(我猜这意味着根 web.config)。


一种可能的解决方案是集中登录页面并根据请求的来源进行重定向,如果它来自外部页面,则将其发送到外部登录页面,否则发送到内部页面。

它会起作用,但如果可能的话,我想要可以在 web.config 中配置它的解决方案。

谢谢

4

4 回答 4

1

我很困惑?为什么有两个用户数据存储?我了解内部与外部,但如果这是同一个应用程序,您可以分配角色以向内部用户授予更多权限。此外,您可以允许您的内部用户在没有 VPN 的情况下在家中访问该站点。

即便如此,如果您必须拥有两家商店,您最好的选择是复制该应用程序。它可以是确切的应用程序,但您将它放在一台内部服务器和一台外部服务器上。然后,您可以对不同位置的用户进行身份验证。但是请注意,您仍然需要角色,除非您正在拼凑应用程序。

如果您需要针对两个商店进行身份验证,您可以使用自定义提供程序来完成。ASP.NET 登录模型允许自定义提供程序,并且很容易构建一个: http: //msdn.microsoft.com/en-us/library/f1kyba5e.aspx http://msdn.microsoft.com/en-我们/图书馆/aa479048.aspx

现在,如果您必须重定向到不同的页面(由于某种原因您被困在这个模型中?),您可以通过 IP 地址来完成。您的内部网络很可能使用 10 点或 192 点 IP 方案。如果是这样,这些地址将被转移到内部。其余的交给外部。这将需要您设置一些进行重定向的东西。我知道您可以在登录页面上执行此操作,如果不是使用 HTTP 处理程序的话。

然而,这似乎是一项非常艰巨的工作。我仍然不明白为什么你必须以这种方式完成任务。

于 2009-03-09T15:14:09.063 回答
0

如果您可以作为两个不同的 IIS 应用程序运行,那么您可以有不同的身份验证提供程序(或同一提供程序的不同实例......可能使用相同的数据库和提供程序上的应用程序属性来区分)。

但是不同的网络应用程序意味着没有共享状态(应用程序和会话)和重复安装。对于内部网/互联网,这将允许外部部署不包括互联网用户无法访问的组件(从而通过减少表面积来提高安全性)。

否则,您可能需要一个自定义身份验证提供程序,该提供程序根据登录者转发到其中一个内置身份验证提供程序。

于 2009-03-09T14:29:10.560 回答
0

如果您的站点是单个 Web 应用程序,您可能会为此使用 ASP.NET 角色提供程序模型,它有两个角色,一个用于内部页面,一个用于外部页面(您可以使用 <location> 配置配置该 pr. 文件夹元素)。

有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/9ab2fxh0.aspx

于 2009-03-09T14:35:18.983 回答
0

我有一个简单的方法来处理这个可能对某人有用。我基本上希望能够为访客登录和注册用户使用相同的代码。我还有一个移动版本的网站,当身份验证票到期时,我想将其发送到不同的登录页面。

可能不是最优雅的解决方案,但足够简单:

    Public Sub btnSubmit_Click(ByVal sender As Object, ByVal e As EventArgs)
        If Page.IsValid Then
            Dim userLogin As String = ""

            userLogin = System.Guid.NewGuid.ToString
            FormsAuthentication.RedirectFromLoginPage(userLogin, False)
            ' place a url param throughout my app, only four pages so no 
            ' big problem there in this case g stands for guest           
            Response.Redirect("menu.aspx?m=g", False)

        End If
End Sub

然后,在 Global.asax 中:

    Protected Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As System.EventArgs)

        If Not Request.IsAuthenticated And _
(Not Request.RawUrl.ToLower.Contains("guestlogin.aspx")) And _
(Not Request.RawUrl.ToLower.Contains("registeredlogin.aspx")) And _
(Not Request.RawUrl.ToLower.Contains("mobilelogin.aspx")) Then
            Response.Redirect("spLogin.aspx?m=" & Request.QueryString("m"))
        End If

    End Sub

然后,在您的登录页面(在您的 Web.config 中指定的页面):

        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            If Not Page.IsPostBack Then
    if request.querystring("m")="g" then
                    Response.Redirect("guestlogin.aspx?m=g")

    elseif  request.querystring("m")="r" then
                    Response.Redirect("registeredlogin.aspx?m=r")
    elseif  request.querystring("m")="m" then
                    Response.Redirect("mobilelogin.aspx?m=m")

end if
End If
End Sib
于 2010-11-15T04:15:32.673 回答