0

我想爲我的項目實施授權。這將是一個自定義授權,管理員可以創建角色並分配給用戶。在頁面級授權很簡單,用戶可以訪問或不訪問頁面。現在有人可以建議哪個編寫授權用戶代碼的最佳位置 - Global.asax或HttpModule?或者別的地方?ASP.NET Webforms授權

我有一個Session變量,我需要訪問授權用戶。我嘗試在Application_AuthenticateRequest(Globaal.asax)中編寫代碼,但發現該會話無法訪問。 Google搜索後,我發現Application_PreRequestHandlerExecute是一個安全的地方,可以在Global.asax中訪問Session。所以我的問題是,如果Application_PreRequestHandlerExecute被稱爲每個請求?和一個安全的地方寫授權代碼?有時候,我也注意到會議在這個事件中也是空的。

+0

您是否試圖創建一個管理員窗體來執行ASP.NET配置工具(在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

感謝愛爾蘭人。我已經完成了所有的基礎工作來創建角色和對象。我甚至有一個準備好授權用戶的代碼,只需要確認Global.asax中的Application_PreRequestHandlerExecute是否是寫授權代碼或其他地方的正確位置。您建議的鏈接將要求我放棄我的代碼並以新鮮的方式開始。 –

0

我會用ASP.NET的HttpModule實現一個過濾器,然後在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

David:會話是否在onAuthenticateRequest中可訪問? –