在某些情况下如何覆盖/更改FormsAuthentication LoginUrl

时间:2009-04-14 16:03:42

标签: asp.net .net forms-authentication

有没有办法动态更改FormsAuthentication的LoginUrl?我所拥有的是受FormsAuth保护的整个站点,但是对于子文件夹中的某些页面,我想将用户带到不同的登录页面,并让FormsAuth处理ReturnUrl的内容。这是可能的还是我必须为子文件夹案例编写自己的重定向代码?

这是一个示例布局:

   ~/LogOn1.aspx
   ~/Protected1.aspx
   ~/Protected2.aspx
   ~/Subfolder/
   ~/Subfolder/LogOn2.aspx
   ~/Subfolder/NotProtected.aspx
   ~/Subfolder/Protected3.aspx

所以我的web.config看起来像:

 <forms loginUrl="~/Splash.aspx" ... />

所有受保护的* .aspx页面都有

 <deny users="?">

我想要的是,如果用户是匿名的,〜/ Subfolder / Protected3.aspx将被重定向到〜/ Subfolder / LogOn2.aspx。

我确实尝试在〜/ Subfolder / web.config中放置一个精简版的web.config:

<?xml version="1.0"?>
<configuration>
   <system.web>
      <authentication mode="Forms">
         <forms loginUrl="~/Subfolder/LogOn.aspx" name="SiteAuth" protection="All" timeout="30" path="/" defaultUrl="~/Subfolder/default.aspx" requireSSL="true" cookieless="UseCookies" enableCrossAppRedirects="false" />
      </authentication>
      <authorization>
         <deny users="?" />
      </authorization>
   </system.web>
</configuration>

但是所有这些都是我的错误:

  

使用部分是错误的   注册为   allowDefinition的= 'MachineToApplication'   超出应用水平。这个错误   可以由虚拟目录引起   未配置为应用程序   在IIS中。

我认为将子文件夹目录设为应用程序会导致更多问题,但也许我错了。如果它是一个应用程序,是不是将〜/ Subfolder中的所有代码与父应用程序的其余部分分开?

3 个答案:

答案 0 :(得分:10)

您遇到的问题是Forms element仅在应用程序级别允许 - 您无法在子web.config中定义它。

很遗憾,您也无法使用Location element定义它,而FormsAuthentication.LoginUrl属性是只读属性。

狩猎一下,看起来你最好的选择是在你的登录页面上有一些代码来检测用户来自哪里(即通过检查“ReturnUrl”查询字符串的值)并重定向到你的其他登录页面,如果它们来自子目录。但是我承认如果你想要多个子目录的自定义登录页面,这根本不能很好地扩展。 :(


回复你的编辑 - 是的,让子文件夹成为一个应用程序会“解决”这个错误,但正如你所指出的那样,你会遇到更多问题,因为你需要移动所有相关的二进制文件,app_code,你进入那个子文件夹的原因,所以它不是一个真正的解决方案。

答案 1 :(得分:7)

我也有这个问题,并且刚刚在这里搜索,试图解决它,然后记得很久以前就已经完成了,我做的是在Page_Load事件的根文件夹中的默认login.aspx页面我做了一个基于重定向的返回url到我的子目录manage及其login.aspx页面!您必须为每个子目录重复相关位。

public void Page_Load(object sender, EventArgs e)
{
 //check for existence of ReturnUrl in QueryString       
    //if it contains manage redirect to manage login page
    if (!String.IsNullOrEmpty(Request.QueryString["ReturnUrl"]))
    {
        if (Request.QueryString["ReturnUrl"].Contains("manage"))
        {
            Response.Redirect("manage/login.aspx");

        }
    } 
}

答案 2 :(得分:5)

每个子文件夹都允许您拥有单独的Web配置文件。因此,您可以在子文件夹中添加带有标记的web.config:

<authentication mode="Forms">
    <forms loginUrl="~/Subfolder/LogOn2.aspx" />
</authentication>