У меня проблема с перезаписью URL-адресов и аутентификацией по формам в ASP.NET ... На основании статей, которые я нашел в сети, я создал следующее HttpModule
:
public class UrlRewriter : IHttpModule
{
private UrlRewriteConfigurationSection config;
public UrlRewriter()
{
config = ConfigurationManager.GetSection("urlrewrites") as UrlRewriteConfigurationSection;
}
public void Dispose()
{
}
public void Init(HttpApplication context)
{
httpApplication.AuthorizeRequest += new EventHandler(OnAuthorizeRequest);
}
private void OnAuthorizeRequest(object sender, EventArgs e)
{
string requestedPath = HttpContext.Current.Request.Path;
foreach (UrlRewriteRule rule in config.UrlRewriteRules)
{
RegexOptions options = config.IgnoreCase ? RegexOptions.IgnoreCase : RegexOptions.None;
Regex regex = new Regex(rule.UrlPattern, options);
Match match = regex.Match(requestedPath);
if (match.Success)
{
string newPath = regex.Replace(requestedPath, rule.RewritePattern);
if (!String.IsNullOrEmpty(newPath))
{
HttpContext.Current.RewritePath(newPath);
return;
}
}
}
}
}
Проблема, однако, в том, что это как-то отключает авторизацию! Для объяснения предположим, у меня есть следующее правило переписывания:
UrlPattern: ^user/profile$
Переписать шаблон: protected/profile.aspx
И предположим, что папка protected
настроена так, чтобы запретить доступ анонимным пользователям ..
Теперь, когда код в OnAuthorizeRequest
выполняется, он корректно переписывает путь к protected/profile.aspx
, однако проблема в том, что мне показывают страницу, хотя я не вошел в систему! Если я запрашиваю страницу напрямую (http://localhost/site/protected/profile.aspx), она не разрешает доступ к сайту ..
Все статьи, которые я нахожу в сети, говорят, что мне нужно переписать в AuthorizeRequest
вместо AuthenticateRequest
или BeginRequest
..
Есть идеи?
NB. Я попытался переместить свой код переписывания в AuthenticateRequest
, который, кажется, работает, но перенаправление на страницу входа не правильно (например, оно перенаправляет на /login?returnUrl=protected/profile.aspx вместо входа в систему? ReturnUrl = пользователь / профиль) * +1028 *