跳到主要內容

asp.net core 設定驗定權限驗證

近日來利用工作空檔,研究了asp.net core權限驗證機制, 並且透過 AuthorizationFilter 實作action 端的權限過濾。

過去在 asp.net 的mvc 有類似的做法,在asp.net core 其實也是大同小異。

asp.net mvc 也一樣是透過ActionFilter 處理權限過濾,Sam是透過cookie將加密資訊進行記錄。


這裡Account 是登錄的使用者帳號資訊,記錄於UserAuth,並且設置有效時間為1小時
var hc = new HttpCookie("UserAuth",Account)
{
    Expires = DateTime.Now.AddHours(1),
    HttpOnly = true
};
Response.Cookies.Add(hc);


在.net core的部份,權限設置已經較為簡化,但仍有需要注意的「眉角」:

首先在Startup.cs 的 ConfigureServices,必須設置系統授權的有效時間,以及指定登入登出頁面:
      services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
     .AddCookie(option=>
            {
                option.LoginPath = new PathString("/Login/Index");   //設定登入頁Action
                option.LogoutPath = new PathString("/Home/Index");//設定登出頁Action
                //設定cookie 有效時間,這部份也可以在登入的時候進行設置
                option.ExpireTimeSpan = TimeSpan.FromMinutes(60);//設定到期時間限制
            });


另外在 Configure 的部份,啟用Route設置以前,須註冊權限驗證模式:
            app.UseAuthentication();
            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });

最後執行系統登入事件處理:
        [AspNetCoreMvc1.Framework.Filter.AllowAnonoymusAttribute]
        public async Task<IActionResult> Logon(string txtUid, string txtPwd)
        {
            //帳密驗證要先處理,這裡直接假設通過後的處理原則
            if(!CheckUser(txtUid, txtPwd)){
                 ViewBag.ErrMsg = "帳密錯誤!!";
                 return RedirectToAction("Index","Login");
            }
            Claim[] claims = {new Claim("Account", txtUid) };     //取名Account
            ClaimsIdentity claimsIdentity = new ClaimsIdentity(claims , CookieAuthenticationDefaults.AuthenticationScheme);//Scheme必填
            ClaimsPrincipal principal = new ClaimsPrincipal(claimsIdentity);            

            var authProperties = new AuthenticationProperties{};
            await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimsIdentity), authProperties);
            var newclims = HttpContext.User.Claims;
            return RedirectToAction("Index","Home");
        } 


執行系統登出:
//處理系統登出
public async Task<IActionResult> Logout()
{
     await HttpContext.SignOutAsync();
     return RedirectToAction("Index","Login");
}


如果需要進行各種畫面的驗證,再透過Filter Attribute
public sealed class LoginAuthorizeAttribute : Attribute, IAuthorizationFilter
{
        public void OnAuthorization(AuthorizationFilterContext context)
        {
            if(!AuthorizeSessionNavigate(context))
                {
                    context.Result = new RedirectToRouteResult(new
                        RouteValueDictionary(new{
                           Controller="Login",
                           Action="Index"
                    }));
                }
        }


        private bool AuthorizeSessionNavigate(AuthorizationFilterContext context)
        {                         
            if(context.HttpContext.User.Claims.Where(m=>m.Type ==
                "Account").Count()>0){
                return true;
            }
            return false;
        }
     



    }//end filter class



在需要進行驗證的Action ,增加filter attribute
        [AspNetCoreMvc1.Framework.Filter.LoginAuthorize]
        //執行系統登出
        public async Task<IActionResult> Logout()
        {
            await HttpContext.SignOutAsync();
            return RedirectToAction("Index","Login");
        }


參考來源:
https://dotblogs.com.tw/shadow/2019/01/16/105615
https://blog.johnwu.cc/article/ironman-day14-asp-net-core-filters.html










留言

這個網誌中的熱門文章

右昌的古厝、老街坊

大社老街屋巡禮

  這座三合院的馬背雕飾蠻細工的 上面兩幢的側牆馬背,都有特別的雕飾,這是常見的三合院風格 在我走回程往我家的方向,又看到幾座大院,後頭都是現代化的樓房 這座三合院蠻有規模的,院子邊還有一座古井,也很有歷史了 這是舊三合院的側屋殘壁,屋頂損壞後就沒再修護了 三合院的側牆 走到了三奶里,這邊就有三座古厝 大社最有名的巫家老厝,老厝是在大社的市中心,黃昏市場外面 老厝的院子保存的很完整 大院的右側一角 老厝的左側小旁門 巫家老厝外院 這座古厝在大社三奶里也蠻有名的 大瓦厝的側邊外牆 房子外牆很典雅,搭配裡面有層次的老建物 房子後頭的一塊小田地,有點像我以前屏東阿嬤家的古厝風格 這個景色很像油畫上面看到的,這區塊的古厝週邊都蓋滿了樓房 走到了大社觀音里後可以看到密集的巷弄老房 巷底的老房子,窗戶上緣有雕花裝飾 老三合院的正廳 巷弄邊老房子一角 在街上看到老房子常常有這個廣告 老巷弄與老房,搭配著新跑車 觀音里的老巷弄三合院

好久沒在家附近散步,順便拍些附近的街景

位在大社中華路的黃家古厝,這是大社的古蹟之一 這是觀音里的設區協會 有彩繪的外牆 老街巷弄的老屋 在大社的舊巷弄還是可以看到這些老屋 巷弄裡的三合院建築群 這座三合院主體保留的很完整 在院子一角,發現這座古董,這個是石磨,以前農村裡面常常可以看到 中華路旁邊有一處小公園 這是在中華路上一處蠻顯眼的三合大院 除了三合院,也有許多傳統的二層樓房 這座三合院外牆還有一面屏風