如何使用ASP.Net进行多次登录?

时间:2009-03-09 14:20:00

标签: asp.net login forms-authentication

我正在开发一个内部和外部网站。

这两个部分的用户不同,因此需要不同的登录页面。我想为两个文件夹配置不同的身份验证,但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 个答案:

答案 0 :(得分:1)

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

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

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

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

然而,这似乎是一项非常多的工作。我仍然没有看到为什么你必须以这种方式完成任务的图片。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

如果您的站点是单个Web应用程序,则可以使用ASP.NET角色提供程序模型,具有两个角色,一个用于内部页面,一个用于外部页面(您可以使用&lt配置该pr。文件夹) ; location&gt;配置元素)。

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

答案 3 :(得分: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