авторизация через Forms
От: ne3nayka Россия  
Дата: 22.03.10 14:35
Оценка:
День добрый! Занимаюсь корпоративным сайтом, возникла проблема как реализовать авторизацию пользователей.
Сайт должен быть доступен только корпоративным пользователям. В связи с этим, у него есть 2 доступные всем странички:
1.Приветствия и 2.Авторизации. Все остальные странички должны быть для неавторизованных пользователей недоступны.

Желаемое решение — настройка Web.Confog правильным образом, без модификации самих внутренних страниц.
Возможно, часть логики прописать в Global.asax.

Сейчас настроил Web.Config следующим образом
<authentication mode="Forms">
<forms loginUrl="login.aspx" timeout="1" name=".FOOAUTH" defaultUrl="Welcome.aspx" path="/" cookieless="UseCookies" />
</authentication>
<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="false" timeout="20"/>
<authorization>
<allow users="*" />
</authorization>


При таких настройках попадаю на любую страницу без прохождения авторизации на формах.

Подскажите плиз, реально сделать авторизацию через эти страничку приветствия и форму авторизации не меняя внутренних страниц сайта?
asp.net forms authorization global web.config
Re: авторизация через Forms
От: Диспетчер Россия  
Дата: 22.03.10 14:59
Оценка:
Здравствуйте, ne3nayka, Вы писали:

N>День добрый! Занимаюсь корпоративным сайтом, возникла проблема как реализовать авторизацию пользователей.

N>Сайт должен быть доступен только корпоративным пользователям. В связи с этим, у него есть 2 доступные всем странички:
N>1.Приветствия и 2.Авторизации. Все остальные странички должны быть для неавторизованных пользователей недоступны.

N>Желаемое решение — настройка Web.Confog правильным образом, без модификации самих внутренних страниц.

N>Возможно, часть логики прописать в Global.asax.

N>Сейчас настроил Web.Config следующим образом

N> <authentication mode="Forms">
N> <forms loginUrl="login.aspx" timeout="1" name=".FOOAUTH" defaultUrl="Welcome.aspx" path="/" cookieless="UseCookies" />
N> </authentication>
N> <sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="false" timeout="20"/>
N> <authorization>
N> <allow users="*" />
N> </authorization>


N>При таких настройках попадаю на любую страницу без прохождения авторизации на формах.


N>Подскажите плиз, реально сделать авторизацию через эти страничку приветствия и форму авторизации не меняя внутренних страниц сайта?


К примеру, как это сделано у меня:

Во-первых:

<authorization>
   <deny users="?"/>
</authorization>


Во-вторых, для доступных всем страниц:

<location path="login.aspx">
    <system.web>
      <authorization>
        <allow users="*"/>
      </authorization>
    </system.web>
  </location>
<location path="Приветствие.aspx">
    <system.web>
      <authorization>
        <allow users="*"/>
      </authorization>
    </system.web>
  </location>


В-третьих, для остальных страниц (для каждой):

<location path="Page1.aspx">
    <system.web>
      <authorization>
        <allow roles="Роль1, Роль2"/>
        <deny users="*"/>
      </authorization>
    </system.web>
  </location>
<location path="Page2.aspx">
    <system.web>
      <authorization>
        <allow roles="Роль2"/>
        <deny users="*"/>
      </authorization>
    </system.web>
  </location>



и т.д. и т.п.
Re[2]: авторизация через Forms
От: ne3nayka Россия  
Дата: 22.03.10 17:06
Оценка:
Здравствуйте, Диспетчер, Вы писали:

>>При таких настройках попадаю на любую страницу без прохождения авторизации на формах.


N>>Подскажите плиз, реально сделать авторизацию через эти страничку приветствия и форму авторизации не меняя внутренних страниц сайта?


Д>К примеру, как это сделано у меня:


Д>Во-первых:


Д>
Д><authorization>
Д>   <deny users="?"/>
Д></authorization>
Д>


Д>Во-вторых, для доступных всем страниц:


Д>
Д><location path="login.aspx">
Д>    <system.web>
Д>      <authorization>
Д>        <allow users="*"/>
Д>      </authorization>
Д>    </system.web>
Д>  </location>
Д><location path="Приветствие.aspx">
Д>    <system.web>
Д>      <authorization>
Д>        <allow users="*"/>
Д>      </authorization>
Д>    </system.web>
Д>  </location>
Д>


Д>В-третьих, для остальных страниц (для каждой):


Д>
Д><location path="Page1.aspx">
Д>    <system.web>
Д>      <authorization>
Д>        <allow roles="Роль1, Роль2"/>
Д>        <deny users="*"/>
Д>      </authorization>
Д>    </system.web>
Д>  </location>
Д><location path="Page2.aspx">
Д>    <system.web>
Д>      <authorization>
Д>        <allow roles="Роль2"/>
Д>        <deny users="*"/>
Д>      </authorization>
Д>    </system.web>
Д>  </location>
Д>



Д>и т.д. и т.п.


Подход в целом мне нравится Но в таком случае придется для КАЖДОЙ страницы отдельно прописывать доступ,
роли, что не есть гут. У меня страниц больше сотни. Это не проще чем Кстати, под ролью в данном случае имеется в виду ASPNET-роль(SqlProvider, Администраторы и т.д.)?
У меня то задача простая: своих пускать, чужих не пускать)
В предложенном варианте не задействуется потенциал <authentication mode="Forms">. Может именно в нем — недостающее звено?

Еще была мысль проверять в Global.asax заполнение некого параметра Сессии. Но в обработчике begin_request сессия по каким то причинам недоступна,
а session_start насколько понимаю сработает как раз на общедоступных страницах, потому пользы не принесет...Может какой-то нюанс упустил из виду,
который поможет через него реализовать все таки?
Re[3]: авторизация через Forms
От: ApmeM  
Дата: 22.03.10 18:05
Оценка:
N>Подход в целом мне нравится Но в таком случае придется для КАЖДОЙ страницы отдельно прописывать доступ,
N>роли, что не есть гут. У меня страниц больше сотни. Это не проще чем Кстати, под ролью в данном случае имеется в виду ASPNET-роль(SqlProvider, Администраторы и т.д.)?
N>У меня то задача простая: своих пускать, чужих не пускать)
N>В предложенном варианте не задействуется потенциал <authentication mode="Forms">. Может именно в нем — недостающее звено?

У ииса с его веб.конфигами есть волшебная особенность. если не указывать страницу то его действие распространяется на все вложенные папки.
Таким образом можно настроить иис примерно так:
/
  web.config
  login.aspx
  Приветствие.aspx
  MainSite/
    web.config
    100500файлов.aspx
    100500папок/

в корневой папке в основнем веб конфиге будет какраз авторизация по формам:
    <authentication mode="Forms">
      <forms cookieless="UseCookies" loginUrl="/login.aspx" />
    </authentication>

и те самые 2 страницы, на которые разрешен доступ без логина
в папке MainSite будет расположен основной сайт со всеми его страничками и веб конфигом из 9 строк:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.web>
        <authorization>
            <deny users="?" />
        </authorization>
    </system.web>
</configuration>

Что не позволит ломится в эту папку кому попало.

N>Еще была мысль проверять в Global.asax заполнение некого параметра Сессии. Но в обработчике begin_request сессия по каким то причинам недоступна,

N>а session_start насколько понимаю сработает как раз на общедоступных страницах, потому пользы не принесет...Может какой-то нюанс упустил из виду,
N>который поможет через него реализовать все таки?

в этом случае с глобал асаксом делать ничего не надо. В 2008 студии есть контрол login, который практически все делает сам, от вас потребуется написать обработчик onLoggedIn (ну или как-то так, он там практически один), в котором возвращать true или false — подходят логин с паролем или нет.
Если возникнет желание делать все самому, то предлагаю покурить в сторону FormsAuthentication класса.

Ну а вообще сайт мелкомягких рулеззз — http://msdn.microsoft.com/en-us/library/eeyk640h.aspx — основа авторизации ручным методом
Re[4]: авторизация через Forms
От: ApmeM  
Дата: 22.03.10 18:18
Оценка:
Кстати да, если абсолютность путей не позволяет перенести файлики во внутреннюю папку, то можно сделать примерно как описал ne3nayka
<authorization>
   <deny users="?"/>
</authorization>

<location path="login.aspx">
    <system.web>
      <authorization>
        <allow users="*"/>
      </authorization>
    </system.web>
  </location>
<location path="Приветствие.aspx">
    <system.web>
      <authorization>
        <allow users="*"/>
      </authorization>
    </system.web>
  </location>

Раз у тебя нет ролей, то и описывать их не надо. Просто написал что никому никуда нельзя кроме этих 2х страниц, и все.
Re[3]: авторизация через Forms
От: Диспетчер Россия  
Дата: 23.03.10 06:43
Оценка:
Здравствуйте, ne3nayka, Вы писали:

N>Здравствуйте, Диспетчер, Вы писали:


>>>При таких настройках попадаю на любую страницу без прохождения авторизации на формах.


N>>>Подскажите плиз, реально сделать авторизацию через эти страничку приветствия и форму авторизации не меняя внутренних страниц сайта?


Д>>К примеру, как это сделано у меня:


Д>>Во-первых:


Д>>
Д>><authorization>
Д>>   <deny users="?"/>
Д>></authorization>
Д>>


Д>>Во-вторых, для доступных всем страниц:


Д>>
Д>><location path="login.aspx">
Д>>    <system.web>
Д>>      <authorization>
Д>>        <allow users="*"/>
Д>>      </authorization>
Д>>    </system.web>
Д>>  </location>
Д>><location path="Приветствие.aspx">
Д>>    <system.web>
Д>>      <authorization>
Д>>        <allow users="*"/>
Д>>      </authorization>
Д>>    </system.web>
Д>>  </location>
Д>>


Д>>В-третьих, для остальных страниц (для каждой):


Д>>
Д>><location path="Page1.aspx">
Д>>    <system.web>
Д>>      <authorization>
Д>>        <allow roles="Роль1, Роль2"/>
Д>>        <deny users="*"/>
Д>>      </authorization>
Д>>    </system.web>
Д>>  </location>
Д>><location path="Page2.aspx">
Д>>    <system.web>
Д>>      <authorization>
Д>>        <allow roles="Роль2"/>
Д>>        <deny users="*"/>
Д>>      </authorization>
Д>>    </system.web>
Д>>  </location>
Д>>



Д>>и т.д. и т.п.


N>Подход в целом мне нравится Но в таком случае придется для КАЖДОЙ страницы отдельно прописывать доступ,

N>роли, что не есть гут. У меня страниц больше сотни. Это не проще чем Кстати, под ролью в данном случае имеется в виду ASPNET-роль(SqlProvider, Администраторы и т.д.)?
N>У меня то задача простая: своих пускать, чужих не пускать)
N>В предложенном варианте не задействуется потенциал <authentication mode="Forms">. Может именно в нем — недостающее звено?

N>Еще была мысль проверять в Global.asax заполнение некого параметра Сессии. Но в обработчике begin_request сессия по каким то причинам недоступна,

N>а session_start насколько понимаю сработает как раз на общедоступных страницах, потому пользы не принесет...Может какой-то нюанс упустил из виду,
N>который поможет через него реализовать все таки?

Да, у меня для каждой страницы прописан доступ. И у меня тоже их больше сотни. Но делается это один раз.
Можно прописать доступ для целой папки.
Под ролью подразумевается любая строка, которая потом прописывается в Authorization Ticket при авторизации:

<authentication mode="Forms">
   <forms loginUrl="Auth.ashx" name="InternalAuth" timeout="60" path="/" slidingExpiration="true">
   </forms>
</authentication>



FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket([версия], [имя], [время создания], [срок годности], [хранить ли постоянно], [набор прав]);

HttpContext.Current.Response.Cookies.Set(new HttpCookie(System.Web.Security.FormsAuthentication.FormsCookieName - name из <forms>, System.Web.Security.FormsAuthentication.Encrypt(authTicket)));



В предложенном варианте как раз задействуется потенциал <authentication mode="Forms">. Так у меня реализовано.
Re[5]: авторизация через Forms
От: ne3nayka Россия  
Дата: 23.03.10 07:09
Оценка:
Здравствуйте, ApmeM, Вы писали:
AM>Кстати да, если абсолютность путей не позволяет перенести файлики во внутреннюю папку, то можно сделать примерно как описал ne3nayka
AM>
AM><authorization>
AM>   <deny users="?"/>
AM></authorization>
AM>

AM>
AM><location path="login.aspx">
AM>    <system.web>
AM>      <authorization>
AM>        <allow users="*"/>
AM>      </authorization>
AM>    </system.web>
AM>  </location>
AM><location path="Приветствие.aspx">
AM>    <system.web>
AM>      <authorization>
AM>        <allow users="*"/>
AM>      </authorization>
AM>    </system.web>
AM>  </location>
AM>

AM>Раз у тебя нет ролей, то и описывать их не надо. Просто написал что никому никуда нельзя кроме этих 2х страниц, и все.

Решение вполне удобное! Только есть проблема: при такой настройке во внутренние страницы не попадаю. То есть на приветствие и авторизацию — ок.
А во внутренние страницы уже после успешной авторизации получаю Error message 401.2.: Unauthorized: Logon failed due to server configuration.

Настройки веб.конфига следующие:

<configuration>
  <configSections>...</configSections>

  <location path="login.aspx">
    <system.web>
      <authorization>
        <allow users="*"/>
      </authorization>
    </system.web>
  </location>

  <location path="welcome.aspx">
    <system.web>
      <authorization>
        <allow users="*"/>
      </authorization>
    </system.web>
  </location>
  
  <system.web>
     ...
     <authorization>
        <deny users="?" />
     </authorization>
     ...
  </system.web>
Re[6]: авторизация через Forms
От: ApmeM  
Дата: 23.03.10 17:03
Оценка:
Здравствуйте, ne3nayka, Вы писали:
N>Решение вполне удобное! Только есть проблема: при такой настройке во внутренние страницы не попадаю. То есть на приветствие и авторизацию — ок.
N>А во внутренние страницы уже после успешной авторизации получаю Error message 401.2.: Unauthorized: Logon failed due to server configuration.

N>Настройки веб.конфига следующие:

N>
N><configuration>
N>  <configSections>...</configSections>

N>  <location path="login.aspx">
N>    <system.web>
N>      <authorization>
N>        <allow users="*"/>
N>      </authorization>
N>    </system.web>
N>  </location>

N>  <location path="welcome.aspx">
N>    <system.web>
N>      <authorization>
N>        <allow users="*"/>
N>      </authorization>
N>    </system.web>
N>  </location>
  
N>  <system.web>
N>     ...
N>     <authorization>
N>        <deny users="?" />
N>     </authorization>
N>     ...
N>  </system.web>
N>



Во первых с авторизацией все-таки что-то не то, слово "Unauthorized" как-бы намекает, что логина для системы в общем то не было, то-есть скорее всего login контрол, FormsAuthentication класс или страница микрософта выкурены не полностью
Во вторых я тут не вижу указания
[ccode]
<authentication mode="Forms">
<forms cookieless="UseCookies" loginUrl="Login/Login.aspx" />
</authentication>
[/ccode.
о которых я говорил первым постом. Они все-равно необходимы, мой второй камент был как дополнение к первому. В связи с этим падает сообщение с тем самым словом "Unauthorized", хотя при правильной настройке сайта пользователя должно редиректить на login.aspx, о котором сказано в конфиге.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.