[C#][ASP.NET MVC]自訂AuthorizeAttribute

[C#][ASP.NET MVC]自訂AuthorizeAttribute

經過上一篇實作後,原來自訂Action Filter一點都不複雜(當初想太多了...XD),

只要繼承和了解每個介面功能就可以依需求擴充和自訂,

而網站權限驗證功能我想應該是很普遍的需求,所以我們大概都會自訂AuthorizeAttribute相關判斷邏輯,

這裡紀錄一下。

 

假設資料表結構和資料如下:

image

再看過Authorize Attribute.cs後,就可以來覆寫AuthorizeCore相關邏輯。

繼承AuthorizeAttribute

public class MyAuthorizeAttribute : AuthorizeAttribute
    {     
        protected override bool AuthorizeCore( HttpContextBase httpContext )
        {
            if( httpContext == null )
                throw new ArgumentNullException( "httpContext" );
 
            String[] users = Users.Split( ',' );//取得輸入user清單
            String[] roles = Roles.Split( ',' );//取得輸入role清單
            if( !httpContext.User.Identity.IsAuthenticated )//判斷是否已驗證
                return false;
            if( roles.Length != 0 )
            {
                ASSETEntities db = new ASSETEntities();
                String account = httpContext.User.Identity.Name.ToString(); //登入的使用者帳號
                bool Isright = false;//角色是否正確
                var q = from tbl in db.USERPROFILE
                         where tbl.ACCOUNT == account
                         select new
                         {
                             tbl.ROLE
                         };               
                foreach( String inputval in roles )//循環比對角色資料
                {
                    if( q.First().ROLE.ToString() == inputval )  
                        return true;                    
                    else                    
                        Isright = false;                     
                }
                return Isright;
            }
            return true;
        }

Controller 

 [MyAuthorizeAttribute( Roles = "DEV,HR" )]
        public ActionResult About()
        {
            return View();
        }

  

 

這樣就完成了簡單的網站安全驗證,只要登入的使用者角色不屬於DEV或HR,一律都會被導回預設登入頁面。

 

參考

AuthorizeAttribute Class

AuthorizeAttribute.cs