網站結構如下:
/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>