Сообщение отклонено при авторизации с помощью FormsAuthentication - PullRequest
3 голосов
/ 21 июля 2010

Итак, я реализовал свой IPrincipal.IsInRole (...) и использую FormsAuthentication так:

<authentication mode="Forms">
     <forms loginUrl="Login.aspx" name="someName" timeout="600"/>
</authentication>

Тогда у меня есть страница, требующая от вас аутентификации и наличия у вас "roleA". Это настроено так:

 <location path="SomePage.aspx">
  <system.web>
   <authorization>
    <allow roles="roleA" />
    <deny users="*"/>
   </authorization>
  </system.web>
 </location>

Теперь я захожу в свое веб-приложение, но с пользователем, у которого нет роли А. Когда я захожу на SomePage.aspx, меня перенаправляют на Login.aspx, URL-адрес, указанный в loginUrl элемента формы. Итак, мой вопрос: разве я не могу указать сообщение об отказе в авторизации или URL? Если пользователь авторизован, но не авторизован, зачем мне перенаправлять на страницу входа. Это смущает пользователя. Пожалуйста, скажите мне, что я упускаю что-то простое.

Спасибо за чтение!

Ответы [ 3 ]

1 голос
/ 21 июля 2010

Roles.IsUserInRole - если вы просто используете это для этой страницы, добавьте это в код позади. Если у вас много страниц, вы можете поместить это в базовый класс и читать либо из файла web.config, либо из базы данных на странице. Я верю, что это даст вам максимальный контроль.

1 голос
/ 21 июля 2010

Да, это немного раздражает.Возможно, у кого-то есть более простая идея, но решение (хак?), Которое мы придумали, заключалось в поиске первоначально запрошенного URL-адреса, который ASP.NET добавляет в строку запроса, когда пользователь перенаправляется на страницу входа.

Мы создали новый раздел web.config, в котором хранится набор ключей / значений, соответствующих фрагменту URL перенаправления для сообщения авторизации:

<configSections>
    <section name="authorizationFailureMessages" type="System.Configuration.NameValueSectionHandler, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    ...etc...
</configSections>

<authorizationFailureMessages>
    <add key="MemberResources" value="MembershipRequired" />
    <add key="Staff" value="StaffOnly" />
    <add key="Departments/Administration/BoardOfDirectors" value="BoardOfDirectorsOnly" />
    ...etc...
</authorizationFailureMessages>

В событии Page_Load ()на странице Login.aspx мы вызываем метод, который использует этот URL-адрес для определения того, какое (не) событие авторизации произошло, а затем перенаправляет их на страницу сообщения, которая отображает соответствующий текст:

private void DisplayAppropriateAuthorizationMessage ()
{
    if ( !Page.User.Identity.IsAuthenticated )
        return;

    string redirectUrl = FormsAuthentication.GetRedirectUrl( Page.User.Identity.Name, false );

    if ( string.IsNullOrEmpty( redirectUrl ) )
        return;

    NameValueCollection authorizationFailureMessages = ConfigurationManager.GetSection( "authorizationFailureMessages" ) as NameValueCollection;

    if ( authorizationFailureMessages == null )
        return;

    foreach ( string key in authorizationFailureMessages.AllKeys )
    {
        if ( redirectUrl.Contains( key ) )
        {
            Response.Redirect( String.Format( "Message.aspx?{0}={1}", Constants.QueryStringKeys.ERRORMESSAGENAME, authorizationFailureMessages[ key ] ), true );
        }
    }
}
0 голосов
/ 24 марта 2012

Я в основном согласен с решением @MattPeterson.Но я предлагаю два улучшения.

  1. На мой взгляд, вы просто говорите, что «в зависимости от ваших ролей вам не разрешено посещать эту страницу», этого достаточно.Вам не нужно указывать, какие дополнительные роли необходимы, что позволит раскрыть детали управления авторизацией вашего сайта.

  2. Список контроля доступа можно получить из web.config (в каждой папке), и вам не нужно снова писать <add key="MemberResources" value="MembershipRequired" />.

Я полагаю, что в вашем файле web.config должно быть что-то похожее на

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

.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...