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

slo*_*ife 17 .net asp.net forms-authentication

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

这是一个示例布局:

   ~/LogOn1.aspx
   ~/Protected1.aspx
   ~/Protected2.aspx
   ~/Subfolder/
   ~/Subfolder/LogOn2.aspx
   ~/Subfolder/NotProtected.aspx
   ~/Subfolder/Protected3.aspx
Run Code Online (Sandbox Code Playgroud)

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

 <forms loginUrl="~/Splash.aspx" ... />
Run Code Online (Sandbox Code Playgroud)

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

 <deny users="?">
Run Code Online (Sandbox Code Playgroud)

我想要的是,如果用户是匿名的,〜/ 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>
Run Code Online (Sandbox Code Playgroud)

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

在应用程序级别之外使用注册为allowDefinition ='MachineToApplication'的部分是错误的.此错误可能是由于未在IIS中将虚拟目录配置为应用程序引起的.

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

Zha*_*uid 12

你遇到的问题是Forms元素只允许在应用程序级别 - 你不能在sub-web.config中定义它.

遗憾的是,您也无法使用Location元素定义它,并且FormsAuthentication.LoginUrl属性是只读的.

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


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


小智 8

我也有这个问题,并且刚刚在这里搜索,试图解决它,然后记得很久以前就完成了它,我做的是在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");

        }
    } 
}
Run Code Online (Sandbox Code Playgroud)


rah*_*kim 5

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

<authentication mode="Forms">
    <forms loginUrl="~/Subfolder/LogOn2.aspx" />
</authentication>
Run Code Online (Sandbox Code Playgroud)

  • 当我在子文件夹中放下被剥离的web.config时出现错误:使用在应用程序级别之外注册为allowDefinition ='MachineToApplication'的部分是错误的.此错误可能是由于未在IIS中将虚拟目录配置为应用程序引起的. (2认同)