0

Я хочу реализовать Авторизация для моего проекта. Это будет настраиваемая авторизация, когда администраторы могут создавать роли и назначать пользователям. Авторизация на уровне страницы проста, либо у пользователя есть доступ к странице, либо нет. Теперь может кто-нибудь предположить, что лучше всего написать код для авторизации пользователей - Global.asax или HttpModule? или где-то еще?Авторизация ASP.NET Webforms

У меня есть переменная Session, к которой мне нужно получить доступ, разрешая пользователям. Я попробовал написать код в Application_AuthenticateRequest (Globaal.asax), но обнаружил, что сеанс в нем недоступен. После googling я обнаружил, что Application_PreRequestHandlerExecute - безопасное место для сеанса, доступное в Global.asax. Поэтому мой вопрос заключается в том, что если для каждого запроса вызывается Application_PreRequestHandlerExecute? и безопасное место для написания кода для авторизации? Время от времени я заметил, что в этом событии Сессия тоже нулевая.

+0

Вы пытаетесь создать админ-форму для выполнения функций ASP.NET Configuration Tool (в VS)? – IrishChieftain

+0

IrishChieftain - Да. –

ответ

0

Вот учебник, который показывает вам, как построить Wsat подобный инструмент с нуля:

Rolling Your Own Website Administration Tool - Part 1

Вот еще один источник учебники, чтобы сделать то же самое:

How to handle security and authorization in your Web Forms applications using ASP.NET membership and roles.

+0

Спасибо Ирландский. Я сделал всю работу над созданием ролей, объектов. У меня даже есть код, готовый разрешить пользователям, и просто нужно подтвердить, что если Application_PreRequestHandlerExecute в Global.asax будет правильным местом для написания кода для авторизации или где-то еще. Ссылки, которые вы предложили, потребуют от меня выбросить мой код и начать как новый. –

0

Я бы использовал фильтр с использованием HttpModule ASP.NET, а затем настроил его в Web.config.

Фильтр может проверить URL-адрес страницы, а также пользователя, который в настоящее время вошел в систему (и роль ...), а затем принять решение разрешить запрос через или нет.

Пример кода:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Collections.Specialized; 
using Axiomatics.Security.AccessControl.Protocols.Xacml; 

namespace axiomatics 
{ 
    public class AuthZHttpModule : IHttpModule 
    { 

     public void Dispose() 
     { 
     } 

     public void Init(HttpApplication context) 
     { 
      // context.BeginRequest += new EventHandler(OnBeginRequest); 
      context.AuthenticateRequest += new EventHandler(onAuthenticateRequest); 

     } 

     public void onAuthenticateRequest(Object s, EventArgs e) 
     { 
      HttpApplication app = s as HttpApplication; 
      // HttpModule called - let's check the current situation 
      Global g = (Global)s; 
      String username = ""; 
      if (g.User!=null && g.User.Identity!=null){ 
       username = g.User.Identity.Name; 
      } 
      string requestUrl = g.Request.Url.LocalPath; 
      // Only protect .aspx pages 
      if (requestUrl.EndsWith("aspx")){ 
       AuthorizationDecision decision = PDPUtil.pageAuthorized(username, g.Request); 

       bool grantPageAccess = decision.Decision == Decision.Permit; 
       if (grantPageAccess == false) 
       {  
        g.Response.Redirect("/error.aspx"); 
       } 
      } 
     } 
    } 
} 

В примере кода я использую XACML управляемый двигатель авторизации (PDPUtil.pageAuthorized()), чтобы определить, должен ли быть предоставлен доступ.

Вы можете заменить кусок XACML своей собственной логикой, если хотите.

+0

Дэвид: Доступна ли сессия в onAuthenticateRequest? –