[转] HOWTO:使ASP.NET网站Forms验证可以指定多个登录页面

原文转自:http://www.cnblogs.com/yicone/archive/2008/05/22/1204431.html

 

网站结构如下:
    /default.aspx
    /login.aspx
    /adminlogin.aspx
    /member/*.aspx
    /admin/*.aspx

需求:访问/member/路径下的页面的请求转向到/login.aspx;
             访问/admin/路径下的页面的请求被转向到/adminlogin.aspx;

一开始,自己假想在/Web.config中作如下配置可以达到目的:

<system.web>
    <authentication mode="Forms">
        <forms loginUrl="/Login.aspx" name=".ASPXFORMSAUTH">
        </forms>
    </authentication>
</system.web>
<location path="member">
    <system.web>
        <authorization>
            <deny users="?"/>
        </authorization>
    </system.web>
</location>
<location path="admin">
    <system.web>
        <authentication mode="Forms">
            <forms loginUrl="/AdminLogin.aspx" name=".ASPXFORMSAUTH">
            </forms>
        </authentication>
        <authorization>
            <deny users="?"/>
        </authorization>
    </system.web>
</location>
 

但很快发现,这样会导致一个运行时错误:

在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的节是错误的

Google了几下,遇到同样错误的不少,但问题相似的不多。于是临时采用了一种变通的做法(急于解决问题,可能有良好的/更好的解决方案)。两个步骤:

1. 定义/LoginHandler.ashx。在ProcessRequest方法中,

    if (!HttpContext.Current.User.Identity.IsAuthenticated){
                    string loginUrl;
                    string returnUrl = context.Request.Params["returnUrl"];

                    if(returnUrl.Contains("/Admin/")) {
                        loginUrl = "/AdminLogin.aspx";
                    }
                    else{
                        loginUrl = "/Public/Login.aspx";
                    }

                    if (!string.IsNullOrEmpty(context.Request.Params["returnUrl"])){
                        loginUrl = loginUrl + "?returnUrl=" + HttpUtility.UrlEncode(context.Request.Params["returnUrl"]);
                    }
                    context.Response.Redirect(loginUrl);
    }

2. 配置/Web.config,

<system.web>
    <authentication mode="Forms">
        <forms loginUrl="/LoginHandler.ashx" name=".ASPXFORMSAUTH">
        </forms>
    </authentication>
</system.web>
<location path="LoginHandler.ashx">
    <system.web>
        <httpHandlers>
            <add verb="*" path="LoginHandler.ashx" type="Web.LoginHandler" validate="true" />
        </httpHandlers>
    </system.web>
</location>
<location path="member">
    <system.web>
        <authorization>
            <deny users="?"/>
        </authorization>
    </system.web>
</location>
<location path="admin">
    <system.web>
        <authorization>
            <deny users="?"/>
        </authorization>
    </system.web>
</location>
posted on 2010-06-17 22:07  黄小二  阅读(413)  评论(0编辑  收藏  举报