zoukankan      html  css  js  c++  java
  • HOWTO:使ASP.NET网站Forms验证可以指定多个登录页面

    网站结构如下:
        /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>
  • 相关阅读:
    bootstrap学习(全局CSS样式)(二)
    第八周
    bootstrap学习(全局CSS样式)(一)
    变量的解构赋值 ES6
    ES6的let和const命令
    github之怎么上传本地项目
    浅谈js对象及对象属性
    解决sublime text3 文件名,小框框的办法
    web04--cookie
    web03--session
  • 原文地址:https://www.cnblogs.com/yicone/p/1204431.html
Copyright © 2011-2022 走看看