понедельник, ноября 07, 2005

}{орошо забытое старое

Бывает так, что надо запретить доступ только к некоторым страницам web-приложения. Чтобы не городить собственных безумств, надо пользоваться механизмом, уже существующим в .NET. Наиболее простой из них - Forms Auth.

Схема его работы проста:
1. В web.config указываются защищаемые страницы
2. Там же указывается, куда надо направить пользователя при попытке пробраться к данным, требующим авторизации
3. На странице проверки полномочий юзверя (п.2) выполняем проверку (можно стандартными средствами, через записи в web.config, а лучше - через БД) и если всё нормально - пользователь идёт на ту страницу, куда его с ходу не пустили.

Вроде ничего особенного, но.
1. Не нужно изобретать механизма. Обычно лепят что-то через cookie, session и пр. Это ужасно.
2. Это точно работает и гибко, при томЪ.

В деталях это выглядит так.
1. В web.config вносим запись


<configuration>
<location path="download.aspx">
<system.web>
<authorization>
<deny users="?">
</deny>
</authorization>
</system.web>
</location>

Это запретит доступ всем, кто не авторизован, к странице download.aspx
2. В тот же самый web.config вписываем

<configuration>
<system.web>
<authentication mode="Forms">
<forms loginurl="login.aspx"/>
</authentication>
</system.web>

К этой странице будет перенаправлен человек, про которого мы ещё не знаем, кто он.
3. В коде login.aspx надо написать свою проверку (как угодно), и если удалось понять, кто к нам пришёл, то, в случае наличия у пассажира полномочий - выполнить одну простую строчку в коде:
FormsAuthentication.RedirectFromLoginPage("ЗдесьИмяПользователя", false); это приведёт к тому, что пользователь после успешного опознания отправится прямиком на ту страницу, к которой и обращался первоначально.

Детали можно в MSDN посмотреть. Делается это дело через cookie со спец. именем (можно управлять в web.config) и спец. формированием пути при обращении к защищённому ресурсу. Дёшево и сердито.

Ну и второе. Не знаю, как кого, а меня бесит то, что после Response.Redirect текущий поток прерывается. Почему - долго рассказывать. Но бесит. Чтобы не тратить нервную энергию зря, вот такой код - очень помогает.

static object m_RedirectSync = new object();
public static void Redirect(Page Current, string Url)
{
lock(m_RedirectSync)
{
Current.Response.Buffer = true;
Current.Response.Status = "302 Moved Temporarily";
Current.Response.AddHeader("Location", Url);
Current.Response.AddHeader("Content-Length", "0");
Current.Response.Flush();
}
}

HTTP придумали очень умные люди. Предусмотрительные, во всяком случае.
С практической т.зр., пользователи почти ничего не платят за этот маленький фокус. Ну, разве что отметят странность, почему это progressbar дважды дёргался при одном запросе страницы. Но и то - только те, что на обычных модемах. Прочие - не заметят вообще ничего.

Комментариев нет: