我正在开发一个内部和外部网站。
这两个部分的用户不同,因此需要不同的登录页面。我想为两个文件夹配置不同的身份验证,但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中配置它。
由于
答案 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