Is there a way to dynamically change the LoginUrl of FormsAuthentication? What I have is the whole site protected by FormsAuth, but for some pages in a sub folder, I\'d lik
The problem you're having is that the Forms element is only allowed at the application level - you can't define it in a sub-web.config.
Unfortunately you also can't define it using a Location element, and the FormsAuthentication.LoginUrl property is read only.
Hunting around a bit, it looks like your best bet would be to have some code on your login page that detects where the user has arrived from (i.e. by checking the value of the "ReturnUrl" query string) and redirecting to your other login page if they are from the subdirectory. However I admit that this doesn't scale well at all if you want custom login pages for multiple sub-directories. :(
In repsonse to your edit - yes, making the sub-folder an application would "solve" this error, but as you point out, you'd then have more problems, as you'd need to move all the relevant binaries, app_code, what have you into that sub-folder as well, so it's not really a solution.
Each subfolder allows you to have a separate webconfig file. So you could put a web.config in your subfolder with the tags:
<authentication mode="Forms">
<forms loginUrl="~/Subfolder/LogOn2.aspx" />
</authentication>
I had this problem as well and have just googled here trying to solve it then remembered had done it long ago and what I did was in the default login.aspx page in the root folder in the Page_Load event I did a redirect based on return url to my sub directory manage and its login.aspx page! You'd have to repeat the relevant bit for each sub directory.
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");
}
}
}