Day28 Policy-based authorization

之前有说到 ASP.NET Core Identity 使用的是基於 Claim 的验证,其实 ASP.NET Core Identity 有不同类型的授权方式,最简单的登入授权、角色授权、Claim 授权,但上述几种都是以一种方式实作:原则授权(Policy-based authorization)。

所谓的原则授权就是自订一种 Policy,只要满足 Policy 订的条件就能得到授权,不论条件是登入者是哪个 User、必须有某个 Role、某个 Claim、还是同时有 Role 跟 Claim等等。

一开始可能很难懂,笔者也是花了一段时间才理解,Claim 对应的是一组资讯如 new Claim("Age", "18"),policy 则相当於规定如某间酒吧规定使用者的年龄必须大於18岁才能进入,之前说过 Role 就是型别为 Role 的 Claim,所以也是一样的道理。

而在 ASP.NET Core 定义 Policy 也不难,只要在ConfigureServices()定义即可,下方的程序定义了一个 Policy 名为"IsAdmin",这个 Policy 指定需要有"ManageRole"这个 Claim 才能通过授权。

        public void ConfigureServices(IServiceCollection services)
        {
			…
            services.AddAuthorization(options =>
            {
                options.AddPolicy("IsAdmin", policy =>
                {
                    policy.RequireClaim("ManageRole");
                });
            });
		}

在套用前先进入 User 编辑 Claim 的页面,让目前登入者[email protected]持有所有 Claim,否则套用後就看不到这些页面了。另外也编辑[email protected]不过不勾选任何 Claim 直接储存,方便待会测试。
https://ithelp.ithome.com.tw/upload/images/20210928/20140893o9NzcQN4RN.png

在应用上也跟 Role 一样,在[AuthorzieAttribute]後面放入 Policy 这个参数即可,以UserManagement.razor为例。

@page "/UserManagement/UserList"
@attribute [Authorize(Policy = "IsAdmin")]
…

NavMenu.razor也产生一个新的<AuthorizeView> Component,变数套用 Policy。

        <AuthorizeView Policy="IsAdmin">
            <Authorized>
                <li class="nav-item px-3">
                    <NavLink class="nav-link" href="UserManagement/UserList" Match="NavLinkMatch.All">
                        <span class="bi bi-people h4 p-2 mb-0" aria-hidden="true"></span> Users
                    </NavLink>
                </li>
            </Authorized>
        </AuthorizeView>

但这时若以[email protected]登入,却可以看到 User 管理页面,明明ManageUser的值为 false,这是因为 Policy "IsAdmin" 只有要求"ManageRole"这个 ClaimType,通常系统不会这样处理授权,而是会同时比对 ClaimType 跟 ClaimValue,所以把 Policy "IsAdmin" 改完善一点,指定 "IsAdmin" 的 ClaimValue 必须为 "true",这样就完成了简易的 Policy 授权了。
https://ithelp.ithome.com.tw/upload/images/20210928/20140893inr5o8byUj.png
https://ithelp.ithome.com.tw/upload/images/20210928/201408930lotkXFD8P.png

另外要注意的是 ASP.NET Core 对 ClaimType 的处理是不分大小写,但对 ClaimValue 却是大小写分明,以 Policy "IsAdmin"为例,ClaimType 可以是"manageUser"或是"manageuser",ClaimValue 则必须为 "true"。

Ref: Policy-based Authorization in ASP.NET Core – A Deep Dive

Ref: Claim type and claim value in claims policy based authorization in asp net core

Ref: Simple authorization in ASP.NET Core


<<:  事件回力镖 - 捕获与冒泡

>>:  常见网路问题(四):为什麽还是上不了网?DNS Server 设定错误,DNS 的简介及小工具 ping

Day 23 -资料库应用小程序 资料库设计(系统需求分析)

完善的资料库能够有效地存储数据,提供最新、最精确的资讯,满足使用者的应用需求,因此正确的资料库结构设...

CIELab转RGB在网页上呈现的小研究

前几天有个问题是关於「将 CIELab 色彩空间的值,在网页前端显示出来」 其中一个解法是把 CIE...

<Day16>Ticks — 取得指数(Indexs)逐笔成交资料

● 这章来示范如何取得指数(Indexs)的ticks 回顾上一章,我们学会如何取得选择权的tick...

Day14 NiFi - NiFi Expression Language

今天要来介绍的是 NiFi Expression Language (以下简称NEL)。在前一篇我们...

Day 3 ARM的多样性与开发环境

一般来说,ARM组合语言,目前大部分是称作嵌入式系统,大部分会说它是写到韧体里面的程序语言,就是硬体...