Пользовательская авторизация в ASP.NET с дочерними страницами - PullRequest
0 голосов
/ 07 марта 2009

Я делаю собственный метод аутентификации, который использует легкий объект сеанса для хранения деталей авторизации пользователя. Теперь я хочу, чтобы каждая страница (в основном дочерние страницы мастеров) могла указывать, должен ли пользователь иметь доступ к этой странице.

Должен ли я создать класс страницы и извлечь из него дочерние страницы?

Каков наилучший способ для приложения узнать, какие роли имеют доступ к какой странице?

Ответы [ 4 ]

1 голос
/ 07 марта 2009

Мне не нравится подход базовой страницы. Для меня это слишком поздно для проверки безопасности. Вы можете создать свой собственный HttpModule, чтобы проверить это, либо сохраняя информацию об авторизации в базе данных / xml / ... или читая ее, используя отражение на странице.

context.Handler будет содержать класс Page, который вы выполняете. Таким образом, вы можете сделать что-то вроде этого:

Я копирую часть кода, который я использую, он проверяет роли, общедоступные страницы, пропускает проверку на наличие картинок и скриптов (но вы также можете это сделать):

    // In the HttpModule:
    public void context_PreRequestHandlerExecute(object sender, EventArgs e)
    {
        HttpContext context = HttpContext.Current;

        // Don´t validate permissions if the user wasn´t allowed by the asp.net security
        // Neighter the advanced (custom) permissions are validated for non ASPX files.
        if (!context.Request.FilePath.EndsWith(".aspx") || !context.User.Identity.IsAuthenticated)
            return;

        // Give full access to the unathorized error page, and logins, and so on...
        string pageClass = context.Handler.GetType().BaseType.FullName;

        string param = context.Request["p"];
        if (!string.IsNullOrEmpty(param))
            pageClass += "@" + param;

        if (SecurityService.IsFullTrustClass(pageClass))
            return;

        if (SecurityService.Context.CurrentPerson == null)
        {
            LogOff();
            return;
        }

        // Verify access permissions for the current page
        IList<Role> roles = SecurityService.Context.CurrentPerson.Roles;
        bool allow = SecurityService.HasAccessPermission(pageClass, roles);

        if (!allow)
        {
            LogOff();
        }
    }
0 голосов
/ 07 марта 2009

Если вы подключите его к провайдеру нестандартных ролей, вы фактически можете рассчитывать на конфигурацию asp.net. Существует метод, позволяющий проверить, авторизован ли пользователь для доступа к данной странице:

System.Web.Security.UrlAuthorizationModule.CheckUrlAccessForPrincipal(
     "~/admin/test.aspx", principal, "GET"
);

Затем вы можете использовать обычный подход к web.config для настройки авторизации. При этом, если страницы находятся в одной папке, вы можете просто добавить в эту папку файл web.config и соответствующим образом настроить авторизацию.

0 голосов
/ 07 марта 2009

В тех же сценариях я помещаю страницы, для которых требуется аутентификация, в папку и определяю элемент location в web.config для настройки аутентификации следующим образом:

<location path="protected">
     <system.web>
        <authorization>
          <deny users="?"/>
        </authorization>
    </system.web>
</location>
0 голосов
/ 07 марта 2009

Если вам нужна большая гибкость в авторизации, вам лучше использовать пользовательский класс страниц. В противном случае Web.config должно быть достаточно.

...