{"id":4174,"date":"2026-03-26T07:50:23","date_gmt":"2026-03-26T00:50:23","guid":{"rendered":"https:\/\/portal-atlasx.cdg.co.th\/home\/?post_type=docs&#038;p=4174"},"modified":"2026-03-27T10:32:22","modified_gmt":"2026-03-27T03:32:22","slug":"policy-based-authorization","status":"publish","type":"docs","link":"https:\/\/portal-atlasx.cdg.co.th\/home\/docs\/axws\/fundamentals\/policy-based-authorization\/","title":{"rendered":"Policy-based authorization"},"content":{"rendered":"\n\n\n<p>\u0e40\u0e14\u0e34\u0e21\u0e17\u0e35\u0e41\u0e2d\u0e1b\u0e1e\u0e25\u0e34\u0e40\u0e04\u0e0a\u0e31\u0e19\u0e02\u0e2d\u0e07\u0e40\u0e23\u0e32\u0e21\u0e35\u0e23\u0e30\u0e1a\u0e1a\u0e25\u0e47\u0e2d\u0e01\u0e2d\u0e34\u0e19\u0e40\u0e1e\u0e35\u0e22\u0e07\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e40\u0e14\u0e35\u0e22\u0e27 \u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49\u0e17\u0e35\u0e48\u0e25\u0e47\u0e2d\u0e01\u0e2d\u0e34\u0e19\u0e41\u0e25\u0e49\u0e27\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e40\u0e23\u0e35\u0e22\u0e01\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19 API \u0e44\u0e14\u0e49\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14\u0e42\u0e14\u0e22\u0e44\u0e21\u0e48\u0e08\u0e33\u0e01\u0e31\u0e14\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e4c \u0e40\u0e23\u0e32\u0e44\u0e14\u0e49\u0e1b\u0e23\u0e31\u0e1a\u0e21\u0e32\u0e43\u0e0a\u0e49 <strong>Policy-based authorization<\/strong> \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e40\u0e1b\u0e47\u0e19\u0e01\u0e32\u0e23\u0e01\u0e32\u0e23\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e4c\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49 \u0e01\u0e32\u0e23\u0e1b\u0e23\u0e31\u0e1a\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e19\u0e35\u0e49\u0e0a\u0e48\u0e27\u0e22\u0e43\u0e2b\u0e49\u0e40\u0e23\u0e32\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21\u0e01\u0e32\u0e23\u0e40\u0e02\u0e49\u0e32\u0e16\u0e36\u0e07 API \u0e44\u0e14\u0e49\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e15\u0e32\u0e21\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e4c\u0e02\u0e2d\u0e07\u0e41\u0e15\u0e48\u0e25\u0e30\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49 \u0e25\u0e14\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e48\u0e22\u0e07\u0e08\u0e32\u0e01\u0e01\u0e32\u0e23\u0e40\u0e23\u0e35\u0e22\u0e01\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19\u0e42\u0e14\u0e22\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e2d\u0e19\u0e38\u0e0d\u0e32\u0e15 \u0e41\u0e25\u0e30\u0e17\u0e33\u0e43\u0e2b\u0e49\u0e23\u0e30\u0e1a\u0e1a\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e02\u0e22\u0e32\u0e22\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e4c\u0e43\u0e2b\u0e21\u0e48 \u0e46 \u0e44\u0e14\u0e49\u0e07\u0e48\u0e32\u0e22\u0e43\u0e19\u0e2d\u0e19\u0e32\u0e04\u0e15<br><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Schema Registration<\/strong><\/h2>\n\n\n\n<p>\u0e25\u0e07\u0e17\u0e30\u0e40\u0e1a\u0e35\u0e22\u0e19 Schema session \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e43\u0e2b\u0e49 Policy-base \u0e40\u0e02\u0e49\u0e32\u0e16\u0e36\u0e07 session \u0e41\u0e25\u0e30\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e44\u0e14\u0e49<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-Fira-Code\" style=\"font-size:.875rem;font-family:Code-Pro-Fira-Code,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>builder.Services.AddAuth(builder.Configuration);<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #9CDCFE\">builder<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Services<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">AddAuth<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">builder<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Configuration<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u0e01\u0e32\u0e23\u0e01\u0e33\u0e2b\u0e19\u0e14\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e4c<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83e\uddfe \u0e15\u0e32\u0e23\u0e32\u0e07: <code><strong>UM_PERMISSION_FUNCTION<\/strong><\/code><br><\/h3>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><tbody><tr><td><strong>Column<\/strong><\/td><td><strong>Type<\/strong><\/td><td><strong>Required<\/strong><\/td><td><strong>Description<\/strong><\/td><\/tr><tr><td><code>ROLE_ID<\/code><\/td><td>NUMBER<\/td><td>\u2705<\/td><td>\u0e23\u0e2b\u0e31\u0e2a\u0e1a\u0e17\u0e1a\u0e32\u0e17 (Role)<\/td><\/tr><tr><td><code>FUNCTION_ID<\/code><\/td><td>NVARCHAR2(50)<\/td><td>\u2705<\/td><td>\u0e23\u0e2b\u0e31\u0e2a\u0e1f\u0e31\u0e07\u0e01\u0e4c\u0e0a\u0e31\u0e19 \u0e40\u0e0a\u0e48\u0e19 UM-01<\/td><\/tr><tr><td><code>PERMISSION<\/code><\/td><td>NVARCHAR2(100)<\/td><td>\u274c<\/td><td>\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19 \u0e40\u0e0a\u0e48\u0e19 view,edit,delete<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83e\uddfe Stored Procedure: <code><strong>UM_USER_PERM_Q<\/strong><\/code><br><\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-Fira-Code\" style=\"font-size:.875rem;font-family:Code-Pro-Fira-Code,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>CREATE OR REPLACE PROCEDURE ATLASX.UM_USER_PERM_Q\n(\n\tPI_USER_ID IN NUMBER,\n\t\n  PO_DATA         out SYS_REFCURSOR,\n\n  PO_STATUS       out NVARCHAR2,\n  PO_STATUS_MSG   out NVARCHAR2\n)\nIS\nBEGIN\n\tPO_STATUS := 1;\n  PO_STATUS_MSG := ''; \n   \n   OPEN PO_DATA FOR\n\tSELECT \n\t    UR.ROLE_ID,\n\t    PF.FUNCTION_ID,\n\t    PF.PERMISSION\n\tFROM UM_USER_ROLE UR\n\tJOIN UM_PERMISSION_FUNCTION PF\n\t    ON UR.ROLE_ID = PF.ROLE_ID\n\tWHERE UR.USER_ID = PI_USER_ID;\n   \t\nEXCEPTION\n    WHEN OTHERS THEN\n\n        PO_STATUS := 0;\n        PO_STATUS_MSG := TO_CHAR(SQLCODE) || '-' || SQLERRM;\n       \nEND UM_USER_PERM_Q;<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">CREATE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">OR<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">REPLACE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">PROCEDURE<\/span><span style=\"color: #D4D4D4\"> ATLASX.UM_USER_PERM_Q<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\tPI_USER_ID <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">NUMBER<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  PO_DATA         <\/span><span style=\"color: #569CD6\">out<\/span><span style=\"color: #D4D4D4\"> SYS_REFCURSOR,<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  PO_STATUS       <\/span><span style=\"color: #569CD6\">out<\/span><span style=\"color: #D4D4D4\"> NVARCHAR2,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  PO_STATUS_MSG   <\/span><span style=\"color: #569CD6\">out<\/span><span style=\"color: #D4D4D4\"> NVARCHAR2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">IS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\tPO_STATUS := <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  PO_STATUS_MSG := <\/span><span style=\"color: #CE9178\">&#39;&#39;<\/span><span style=\"color: #D4D4D4\">; <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">OPEN<\/span><span style=\"color: #D4D4D4\"> PO_DATA <\/span><span style=\"color: #569CD6\">FOR<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t<\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t    UR.ROLE_ID,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t    PF.FUNCTION_ID,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t    PF.PERMISSION<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t<\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> UM_USER_ROLE UR<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t<\/span><span style=\"color: #569CD6\">JOIN<\/span><span style=\"color: #D4D4D4\"> UM_PERMISSION_FUNCTION PF<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t    <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> UR.ROLE_ID = PF.ROLE_ID<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\t<\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> UR.USER_ID = PI_USER_ID;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   \t<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">EXCEPTION<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">WHEN<\/span><span style=\"color: #D4D4D4\"> OTHERS <\/span><span style=\"color: #569CD6\">THEN<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        PO_STATUS := <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        PO_STATUS_MSG := TO_CHAR(SQLCODE) || <\/span><span style=\"color: #CE9178\">&#39;-&#39;<\/span><span style=\"color: #D4D4D4\"> || SQLERRM;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> UM_USER_PERM_Q;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e01\u0e33\u0e2b\u0e19\u0e14\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e41\u0e25\u0e49\u0e27 \u0e2b\u0e25\u0e31\u0e07\u0e08\u0e32\u0e01\u0e17\u0e35\u0e48 user login \u0e08\u0e30\u0e14\u0e36\u0e07\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e4c user \u0e08\u0e32\u0e01 <code><strong>UM_USER_PERM_Q<\/strong><\/code> \u0e08\u0e32\u0e01\u0e19\u0e31\u0e49\u0e19\u0e08\u0e30\u0e44\u0e14\u0e49 session \u0e1e\u0e23\u0e49\u0e2d\u0e21\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e17\u0e35\u0e48\u0e01\u0e33\u0e2b\u0e19\u0e14\u0e44\u0e27\u0e49\u0e08\u0e32\u0e01 <strong>UM_PERMISSION_FUNCTION<\/strong><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-Fira-Code\" style=\"font-size:.875rem;font-family:Code-Pro-Fira-Code,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>var session = new SessionData\n{\n    UserId = userInfo.Id,\n    Role = [], \/\/&#91;1,2,3&#93;\n    Permission = [], \/\/ { '1:UM-01 = view,edit'} \/\/ {\"{roleId}:{functionId}\" = \"permission1,permission2\"}\n    ExpiresAt = DateTime.UtcNow.AddMinutes(30),\n    IsRotated = false\n};\n\nusing var queryResult = await userInfoRepository.GetUserPermissionsAsync(userInfo.Id, cancellationToken);\n\nforeach (DataRow row in queryResult.DataTable.Rows)\n{\n    var role = row&#91;\"ROLE_ID\"&#93;.ToString();\n    var functionId = row&#91;\"FUNCTION_ID\"&#93;.ToString();\n    var permission = row&#91;\"PERMISSION\"&#93;.ToString();\n\n    var key = $\"{role}:{functionId}\";\n\n    if (session.Permission.ContainsKey(key))\n    {\n        session.Permission&#91;key&#93; += \",\" + permission;\n    }\n    else\n    {\n        session.Permission.Add(key, permission ?? \"\");\n    }\n}\n\nawait sessionService.CreateSession(sessionId, session, TimeSpan.FromMinutes(30));<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">session<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">SessionData<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">UserId<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">userInfo<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Id<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">Role<\/span><span style=\"color: #D4D4D4\"> = [], <\/span><span style=\"color: #6A9955\">\/\/&#91;1,2,3&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">Permission<\/span><span style=\"color: #D4D4D4\"> = [], <\/span><span style=\"color: #6A9955\">\/\/ { &#39;1:UM-01 = view,edit&#39;} \/\/ {&quot;{roleId}:{functionId}&quot; = &quot;permission1,permission2&quot;}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">ExpiresAt<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">DateTime<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">UtcNow<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">AddMinutes<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">30<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">IsRotated<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">};<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">using<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">queryResult<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">userInfoRepository<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">GetUserPermissionsAsync<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">userInfo<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Id<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">cancellationToken<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">foreach<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #4EC9B0\">DataRow<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">row<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">in<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">queryResult<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">DataTable<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Rows<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">role<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">row<\/span><span style=\"color: #D4D4D4\">&#91;<\/span><span style=\"color: #CE9178\">&quot;ROLE_ID&quot;<\/span><span style=\"color: #D4D4D4\">&#93;.<\/span><span style=\"color: #DCDCAA\">ToString<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">functionId<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">row<\/span><span style=\"color: #D4D4D4\">&#91;<\/span><span style=\"color: #CE9178\">&quot;FUNCTION_ID&quot;<\/span><span style=\"color: #D4D4D4\">&#93;.<\/span><span style=\"color: #DCDCAA\">ToString<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">permission<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">row<\/span><span style=\"color: #D4D4D4\">&#91;<\/span><span style=\"color: #CE9178\">&quot;PERMISSION&quot;<\/span><span style=\"color: #D4D4D4\">&#93;.<\/span><span style=\"color: #DCDCAA\">ToString<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">key<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">$&quot;{<\/span><span style=\"color: #9CDCFE\">role<\/span><span style=\"color: #CE9178\">}:{<\/span><span style=\"color: #9CDCFE\">functionId<\/span><span style=\"color: #CE9178\">}&quot;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">session<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Permission<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">ContainsKey<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">key<\/span><span style=\"color: #D4D4D4\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">session<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Permission<\/span><span style=\"color: #D4D4D4\">&#91;<\/span><span style=\"color: #9CDCFE\">key<\/span><span style=\"color: #D4D4D4\">&#93; += <\/span><span style=\"color: #CE9178\">&quot;,&quot;<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #9CDCFE\">permission<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">session<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Permission<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Add<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">key<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">permission<\/span><span style=\"color: #D4D4D4\"> ?? <\/span><span style=\"color: #CE9178\">&quot;&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">await<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">sessionService<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">CreateSession<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">sessionId<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">session<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">TimeSpan<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">FromMinutes<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">30<\/span><span style=\"color: #D4D4D4\">));<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u0e01\u0e32\u0e23\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e4c<\/strong><\/h2>\n\n\n\n<p>\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49\u0e2a\u0e48\u0e07\u0e04\u0e33\u0e02\u0e2d API \u0e1e\u0e23\u0e49\u0e2d\u0e21 cookie session \u0e23\u0e30\u0e1a\u0e1a\u0e08\u0e30\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e27\u0e48\u0e32\u0e1c\u0e39\u0e49\u0e43\u0e0a\u0e49\u0e21\u0e35 FunctionId \u0e17\u0e35\u0e48\u0e23\u0e30\u0e1a\u0e38\u0e43\u0e19 AxAuthorize \u0e2d\u0e22\u0e39\u0e48\u0e43\u0e19 Claims \u0e2b\u0e23\u0e37\u0e2d\u0e44\u0e21\u0e48 \u0e41\u0e25\u0e30\u0e21\u0e35\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e4c\u0e2d\u0e30\u0e44\u0e23\u0e1a\u0e49\u0e32\u0e07<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-Fira-Code\" style=\"font-size:.875rem;font-family:Code-Pro-Fira-Code,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ Session user login\nvar session = new SessionData\n{\n    UserId = userInfo.Id,\n    Role = [], \/\/&#91;1,2,3&#93;\n    Permission = [], \/\/ { \"1:UM-01\" = \"view,edit\"} \/\/ {\"{roleId}:{functionId}\" = \"permission1,permission2\"}\n    ExpiresAt = DateTime.UtcNow.AddMinutes(30),\n    IsRotated = false\n};\n\n\/\/...\n\n\/\/ \u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07 AxAuthorizeAttribute \u0e43\u0e19\u0e01\u0e32\u0e23\u0e01\u0e33\u0e2b\u0e19\u0e14\u0e2a\u0e34\u0e17\u0e18\u0e34 Endpoint\n&#91;HttpPost(\"userinfo\")&#93;\n&#91;AxAuthorize(\"UM-01\", \"view\", \"edit\")&#93;\npublic IActionResult PostUser()\n{\n    \/\/ Your logic here...\n    return Ok(new\n    {\n        success = true,\n    });\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\">\/\/ Session user login<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">session<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">SessionData<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">UserId<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">userInfo<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Id<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">Role<\/span><span style=\"color: #D4D4D4\"> = [], <\/span><span style=\"color: #6A9955\">\/\/&#91;1,2,3&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">Permission<\/span><span style=\"color: #D4D4D4\"> = [], <\/span><span style=\"color: #6A9955\">\/\/ { &quot;1:UM-01&quot; = &quot;view,edit&quot;} \/\/ {&quot;{roleId}:{functionId}&quot; = &quot;permission1,permission2&quot;}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">ExpiresAt<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">DateTime<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">UtcNow<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">AddMinutes<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">30<\/span><span style=\"color: #D4D4D4\">),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">IsRotated<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">};<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/...<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ \u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07 AxAuthorizeAttribute \u0e43\u0e19\u0e01\u0e32\u0e23\u0e01\u0e33\u0e2b\u0e19\u0e14\u0e2a\u0e34\u0e17\u0e18\u0e34 Endpoint<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">&#91;<\/span><span style=\"color: #4EC9B0\">HttpPost<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;userinfo&quot;<\/span><span style=\"color: #D4D4D4\">)&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">&#91;<\/span><span style=\"color: #4EC9B0\">AxAuthorize<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;UM-01&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;view&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;edit&quot;<\/span><span style=\"color: #D4D4D4\">)&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">public<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">IActionResult<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">PostUser<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">    \/\/ Your logic here...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Ok<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">new<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">success<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">true<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u0e01\u0e32\u0e23\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19 [AxAuthorize]<\/strong><\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u0e1e\u0e32\u0e23\u0e32\u0e21\u0e34\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e15\u0e31\u0e27\u0e41\u0e23\u0e01\u0e04\u0e37\u0e2d <strong>FunctionId<\/strong> \u0e40\u0e0a\u0e48\u0e19 &#8220;UM-01&#8221;<\/li>\n\n\n\n<li>\u0e1e\u0e32\u0e23\u0e32\u0e21\u0e34\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e15\u0e31\u0e27\u0e16\u0e31\u0e14\u0e44\u0e1b\u0e04\u0e37\u0e2d\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e4c\u0e17\u0e35\u0e48\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23 \u0e08\u0e30\u0e23\u0e31\u0e1a\u0e14\u0e49\u0e27\u0e22 params string[] \u0e40\u0e0a\u0e48\u0e19 &#8220;view&#8221;, &#8220;edit&#8221;, &#8220;create&#8221;, &#8220;delete&#8221;<\/li>\n<\/ol>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-Fira-Code\" style=\"font-size:.875rem;font-family:Code-Pro-Fira-Code,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>&#91;AxAuthorize(\"UM-01\", \"view\", \"edit\")&#93;<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">&#91;<\/span><span style=\"color: #4EC9B0\">AxAuthorize<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;UM-01&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;view&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;edit&quot;<\/span><span style=\"color: #D4D4D4\">)&#93;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07<\/strong><\/h3>\n\n\n\n<p>Required Login<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-Fira-Code\" style=\"font-size:.875rem;font-family:Code-Pro-Fira-Code,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>&#91;AxAuthorize()&#93;\n&#91;HttpPost(\"userinfo\")&#93;\npublic IActionResult PostUser()<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">&#91;<\/span><span style=\"color: #4EC9B0\">AxAuthorize<\/span><span style=\"color: #D4D4D4\">()&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">&#91;<\/span><span style=\"color: #4EC9B0\">HttpPost<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;userinfo&quot;<\/span><span style=\"color: #D4D4D4\">)&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">public<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">IActionResult<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">PostUser<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Required FunctionId &#8220;UM-01&#8221; \u0e42\u0e14\u0e22\u0e44\u0e21\u0e48\u0e01\u0e33\u0e2b\u0e19\u0e14 permisssion<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-Fira-Code\" style=\"font-size:.875rem;font-family:Code-Pro-Fira-Code,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ if(userFunctionId == \"UM-01\")\n\n&#91;AxAuthorize(\"UM-01\")&#93;\n&#91;HttpPost(\"userinfo\")&#93;\npublic IActionResult PostUser()<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\">\/\/ if(userFunctionId == &quot;UM-01&quot;)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">&#91;<\/span><span style=\"color: #4EC9B0\">AxAuthorize<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;UM-01&quot;<\/span><span style=\"color: #D4D4D4\">)&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">&#91;<\/span><span style=\"color: #4EC9B0\">HttpPost<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;userinfo&quot;<\/span><span style=\"color: #D4D4D4\">)&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">public<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">IActionResult<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">PostUser<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Required FunctionId &#8220;UM-01&#8221; Permission &#8220;view&#8221; \u0e2b\u0e23\u0e37\u0e2d &#8220;edit&#8221; \u0e01\u0e47\u0e44\u0e14\u0e49<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-Fira-Code\" style=\"font-size:.875rem;font-family:Code-Pro-Fira-Code,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ if(userFunctionId == \"UM-01\" &amp;&amp; new[] { \"view\", \"edit\" }.Any(((p)=> userPermissions.Contains(p))))\n\n&#91;AxAuthorize(\"UM-01\", \"view\", \"edit\")&#93;\n&#91;HttpPost(\"userinfo\")&#93;\npublic IActionResult PostUser()<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\">\/\/ if(userFunctionId == &quot;UM-01&quot; &amp;&amp; new[] { &quot;view&quot;, &quot;edit&quot; }.Any(((p)=&gt; userPermissions.Contains(p))))<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">&#91;<\/span><span style=\"color: #4EC9B0\">AxAuthorize<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;UM-01&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;view&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;edit&quot;<\/span><span style=\"color: #D4D4D4\">)&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">&#91;<\/span><span style=\"color: #4EC9B0\">HttpPost<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;userinfo&quot;<\/span><span style=\"color: #D4D4D4\">)&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">public<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">IActionResult<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">PostUser<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Required FunctionId &#8220;UM-01&#8221; Permission &#8220;view&#8221; \u0e41\u0e25\u0e30 &#8220;edit&#8221;<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-Fira-Code\" style=\"font-size:.875rem;font-family:Code-Pro-Fira-Code,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ if(userFunctionId == \"UM-01\" &amp;&amp; new[] { \"view\", \"edit\" }.All(p => userPermissions.Contains(p)))\n\n&#91;AxAuthorize(\"UM-01\", \"view\")&#93;\n&#91;AxAuthorize(\"UM-01\", \"edit\")&#93;\n&#91;HttpPost(\"userinfo\")&#93;\npublic IActionResult PostUser()<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\">\/\/ if(userFunctionId == &quot;UM-01&quot; &amp;&amp; new[] { &quot;view&quot;, &quot;edit&quot; }.All(p =&gt; userPermissions.Contains(p)))<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">&#91;<\/span><span style=\"color: #4EC9B0\">AxAuthorize<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;UM-01&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;view&quot;<\/span><span style=\"color: #D4D4D4\">)&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">&#91;<\/span><span style=\"color: #4EC9B0\">AxAuthorize<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;UM-01&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;edit&quot;<\/span><span style=\"color: #D4D4D4\">)&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">&#91;<\/span><span style=\"color: #4EC9B0\">HttpPost<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;userinfo&quot;<\/span><span style=\"color: #D4D4D4\">)&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">public<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">IActionResult<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">PostUser<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Required FunctionId &#8220;UM-01&#8221; Permission (&#8220;view&#8221; \u0e2b\u0e23\u0e37\u0e2d &#8220;create&#8221;) \u0e41\u0e25\u0e30 (&#8220;edit&#8221; \u0e2b\u0e23\u0e37\u0e2d &#8220;delete&#8221;)<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-Fira-Code\" style=\"font-size:.875rem;font-family:Code-Pro-Fira-Code,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ if(userFunctionId == \"UM-01\" &amp;&amp; new[] { \"view\", \"edit\" }.Any(p => userPermissions.Contains(p)) &amp;&amp; new[] { \"edit\", \"delete\" }.Any(p => userPermissions.Contains(p)))\n\n&#91;AxAuthorize(\"UM-01\", \"view\", \"create\")&#93;\n&#91;AxAuthorize(\"UM-01\", \"edit\", \"delete\")&#93;\n&#91;HttpPost(\"userinfo\")&#93;\npublic IActionResult PostUser()<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\">\/\/ if(userFunctionId == &quot;UM-01&quot; &amp;&amp; new[] { &quot;view&quot;, &quot;edit&quot; }.Any(p =&gt; userPermissions.Contains(p)) &amp;&amp; new[] { &quot;edit&quot;, &quot;delete&quot; }.Any(p =&gt; userPermissions.Contains(p)))<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">&#91;<\/span><span style=\"color: #4EC9B0\">AxAuthorize<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;UM-01&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;view&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;create&quot;<\/span><span style=\"color: #D4D4D4\">)&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">&#91;<\/span><span style=\"color: #4EC9B0\">AxAuthorize<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;UM-01&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;edit&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;delete&quot;<\/span><span style=\"color: #D4D4D4\">)&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">&#91;<\/span><span style=\"color: #4EC9B0\">HttpPost<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;userinfo&quot;<\/span><span style=\"color: #D4D4D4\">)&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">public<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">IActionResult<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">PostUser<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u0e1b\u0e23\u0e31\u0e1a\u0e41\u0e15\u0e48\u0e07 AxAuthorize<\/strong><\/h2>\n\n\n\n<p>\u0e2b\u0e32\u0e01\u0e42\u0e04\u0e23\u0e07\u0e01\u0e32\u0e23\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e21\u0e35\u0e01\u0e32\u0e23\u0e40\u0e0a\u0e47\u0e04\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e4c\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e15\u0e34\u0e21\u0e19\u0e2d\u0e01\u0e40\u0e2b\u0e19\u0e37\u0e2d\u0e08\u0e32\u0e01\u0e17\u0e35\u0e48 AxAuthorize \u0e44\u0e14\u0e49\u0e40\u0e15\u0e23\u0e35\u0e22\u0e21\u0e44\u0e27\u0e49\u0e43\u0e2b\u0e49 \u0e04\u0e38\u0e13\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e1b\u0e23\u0e31\u0e1a\u0e41\u0e15\u0e48\u0e07\u0e44\u0e14\u0e49\u0e15\u0e32\u0e21\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23 \u0e41\u0e25\u0e30\u0e43\u0e19\u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e19\u0e35\u0e49\u0e40\u0e23\u0e32\u0e08\u0e30\u0e1b\u0e23\u0e31\u0e1a\u0e41\u0e15\u0e48\u0e07 \u0e43\u0e2b\u0e49 AxAuthorize \u0e25\u0e2d\u0e07\u0e23\u0e31\u0e1a\u0e21\u0e32\u0e01\u0e01\u0e27\u0e48\u0e32 1 FunctionId \u0e40\u0e0a\u0e48\u0e19 [AxAuthorize([&#8220;UM-01&#8221;, &#8220;UM-02&#8221;, &#8220;UM-03&#8221;], &#8220;view&#8221;, &#8220;create&#8221;)]<\/p>\n\n\n\n<p>\u0e43\u0e19\u0e01\u0e32\u0e23\u0e1b\u0e23\u0e31\u0e1a\u0e19\u0e35\u0e49\u0e40\u0e23\u0e32\u0e08\u0e30\u0e43\u0e0a\u0e49\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14 4 \u0e44\u0e1f\u0e25\u0e4c \u0e44\u0e14\u0e49\u0e41\u0e01\u0e48<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>AxAuthorizeAttribute.cs<\/strong><br>\u0e17\u0e33\u0e2b\u0e19\u0e49\u0e32\u0e17\u0e35\u0e48\u0e1b\u0e23\u0e30\u0e01\u0e32\u0e28 metadata \u0e43\u0e2b\u0e49 Policy \u0e23\u0e31\u0e1a\u0e23\u0e39\u0e49\u0e27\u0e48\u0e32 Function \u0e17\u0e35\u0e48\u0e08\u0e30\u0e01\u0e33\u0e2b\u0e19\u0e14\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e4c\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e4c\u0e2d\u0e30\u0e44\u0e23\u0e1a\u0e49\u0e32\u0e07<br><\/li>\n\n\n\n<li><strong>AxAuthorizationPolicyProvider.cs<\/strong><br>\u0e17\u0e33\u0e2b\u0e19\u0e49\u0e32\u0e17\u0e35\u0e48\u0e2d\u0e48\u0e32\u0e19 metadata \u0e08\u0e32\u0e01 AxAuthorizeAttribute \u0e41\u0e25\u0e30\u0e40\u0e01\u0e47\u0e1a\u0e44\u0e27\u0e49\u0e17\u0e35\u0e48 AxAuthorizationRequirement \u0e41\u0e25\u0e30\u0e2a\u0e48\u0e07\u0e15\u0e48\u0e2d\u0e44\u0e1b\u0e2b\u0e32 AxAuthorizationHandler<br><\/li>\n\n\n\n<li><strong>AxAuthorizationRequirement.cs<\/strong><br>\u0e17\u0e33\u0e2b\u0e19\u0e49\u0e32\u0e17\u0e35\u0e48\u0e40\u0e1b\u0e47\u0e19 model \u0e40\u0e01\u0e47\u0e1a\u0e04\u0e48\u0e32\u0e15\u0e48\u0e32\u0e07\u0e46 \u0e17\u0e35\u0e48\u0e40\u0e23\u0e32\u0e2a\u0e19\u0e43\u0e08<br><\/li>\n\n\n\n<li><strong>AxAuthorizationHandler.cs<\/strong><br>\u0e17\u0e33\u0e2b\u0e19\u0e49\u0e32\u0e17\u0e35\u0e48\u0e40\u0e1b\u0e47\u0e19\u0e15\u0e31\u0e27\u0e40\u0e0a\u0e47\u0e04\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e4c\u0e2b\u0e25\u0e31\u0e01 Logic \u0e15\u0e48\u0e32\u0e07\u0e46\u0e08\u0e30\u0e2d\u0e22\u0e39\u0e48\u0e17\u0e35\u0e48\u0e19\u0e35\u0e48<br><\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u0e02\u0e31\u0e49\u0e19\u0e15\u0e2d\u0e19\u0e01\u0e32\u0e23\u0e1b\u0e23\u0e31\u0e1a AxAuthorization \u0e43\u0e2b\u0e49\u0e23\u0e2d\u0e07\u0e23\u0e31\u0e1a\u0e21\u0e32\u0e01\u0e01\u0e27\u0e48\u0e32 1 FunctionId<\/strong><\/h3>\n\n\n\n<p><\/p>\n\n\n\n<p>1. \u0e17\u0e35\u0e48 <strong>AxAuthorizeAttribute.cs<\/strong> \u0e1b\u0e23\u0e31\u0e1a parameter \u0e43\u0e2b\u0e49\u0e23\u0e2d\u0e07\u0e23\u0e31\u0e1a FunctionId \u0e21\u0e32\u0e01\u0e01\u0e27\u0e48\u0e32 1<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-Fira-Code\" style=\"font-size:.875rem;font-family:Code-Pro-Fira-Code,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ Before\npublic AxAuthorizeAttribute(string functionId, params string[] permissions)\n{\n    Policy = $\"{POLICY_PREFIX}{functionId}:{string.Join(\":\", permissions)}\";\n}\n\n\/\/ After\npublic AxAuthorizeAttribute(string[] functionId, params string[] permissions)\n{\n    Policy = $\"{POLICY_PREFIX}{string.Join(\",\", functionId)}:{string.Join(\":\", permissions)}\";\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\">\/\/ Before<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">public<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">AxAuthorizeAttribute<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">string<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">functionId<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">params<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">string<\/span><span style=\"color: #D4D4D4\">[] <\/span><span style=\"color: #9CDCFE\">permissions<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">Policy<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">$&quot;{<\/span><span style=\"color: #9CDCFE\">POLICY_PREFIX<\/span><span style=\"color: #CE9178\">}{<\/span><span style=\"color: #9CDCFE\">functionId<\/span><span style=\"color: #CE9178\">}:{<\/span><span style=\"color: #569CD6\">string<\/span><span style=\"color: #CE9178\">.<\/span><span style=\"color: #DCDCAA\">Join<\/span><span style=\"color: #CE9178\">(&quot;:&quot;, <\/span><span style=\"color: #9CDCFE\">permissions<\/span><span style=\"color: #CE9178\">)}&quot;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ After<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">public<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">AxAuthorizeAttribute<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">string<\/span><span style=\"color: #D4D4D4\">[] <\/span><span style=\"color: #9CDCFE\">functionId<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">params<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">string<\/span><span style=\"color: #D4D4D4\">[] <\/span><span style=\"color: #9CDCFE\">permissions<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">Policy<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">$&quot;{<\/span><span style=\"color: #9CDCFE\">POLICY_PREFIX<\/span><span style=\"color: #CE9178\">}{<\/span><span style=\"color: #569CD6\">string<\/span><span style=\"color: #CE9178\">.<\/span><span style=\"color: #DCDCAA\">Join<\/span><span style=\"color: #CE9178\">(&quot;,&quot;, <\/span><span style=\"color: #9CDCFE\">functionId<\/span><span style=\"color: #CE9178\">)}:{<\/span><span style=\"color: #569CD6\">string<\/span><span style=\"color: #CE9178\">.<\/span><span style=\"color: #DCDCAA\">Join<\/span><span style=\"color: #CE9178\">(&quot;:&quot;, <\/span><span style=\"color: #9CDCFE\">permissions<\/span><span style=\"color: #CE9178\">)}&quot;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>2. \u0e17\u0e35\u0e48 <strong>AxAuthorizationRequirement.cs<\/strong> \u0e1b\u0e23\u0e31\u0e1a FunctionId \u0e08\u0e32\u0e01 string \u0e40\u0e1b\u0e47\u0e19 string[]<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-Fira-Code\" style=\"font-size:.875rem;font-family:Code-Pro-Fira-Code,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ Before\npublic sealed class AxAuthorizationRequirement(string functionId, string[] permissions) : IAuthorizationRequirement\n{\n    public string FunctionId { get; } = functionId;\n    public string[] Permissions { get; } = permissions;\n}\n\n\/\/ After\npublic sealed class AxAuthorizationRequirement(string[] functionId, string[] permissions) : IAuthorizationRequirement\n{\n    public string[] FunctionId { get; } = functionId;\n    public string[] Permissions { get; } = permissions;\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\">\/\/ Before<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">public<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">sealed<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">class<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">AxAuthorizationRequirement<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">string<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">functionId<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">string<\/span><span style=\"color: #D4D4D4\">[] <\/span><span style=\"color: #9CDCFE\">permissions<\/span><span style=\"color: #D4D4D4\">) : <\/span><span style=\"color: #4EC9B0\">IAuthorizationRequirement<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">public<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">string<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">FunctionId<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #569CD6\">get<\/span><span style=\"color: #D4D4D4\">; } = <\/span><span style=\"color: #9CDCFE\">functionId<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">public<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">string<\/span><span style=\"color: #D4D4D4\">[] <\/span><span style=\"color: #9CDCFE\">Permissions<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #569CD6\">get<\/span><span style=\"color: #D4D4D4\">; } = <\/span><span style=\"color: #9CDCFE\">permissions<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ After<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">public<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">sealed<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">class<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">AxAuthorizationRequirement<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">string<\/span><span style=\"color: #D4D4D4\">[] <\/span><span style=\"color: #9CDCFE\">functionId<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">string<\/span><span style=\"color: #D4D4D4\">[] <\/span><span style=\"color: #9CDCFE\">permissions<\/span><span style=\"color: #D4D4D4\">) : <\/span><span style=\"color: #4EC9B0\">IAuthorizationRequirement<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">public<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">string<\/span><span style=\"color: #D4D4D4\">[] <\/span><span style=\"color: #9CDCFE\">FunctionId<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #569CD6\">get<\/span><span style=\"color: #D4D4D4\">; } = <\/span><span style=\"color: #9CDCFE\">functionId<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">public<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">string<\/span><span style=\"color: #D4D4D4\">[] <\/span><span style=\"color: #9CDCFE\">Permissions<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #569CD6\">get<\/span><span style=\"color: #D4D4D4\">; } = <\/span><span style=\"color: #9CDCFE\">permissions<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>3. \u0e17\u0e35\u0e48 <strong>AxAuthorizationPolicyProvider.cs<\/strong> <\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-Fira-Code\" style=\"font-size:.875rem;font-family:Code-Pro-Fira-Code,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ Before\npublic Task&lt;AuthorizationPolicy?> GetPolicyAsync(string policyName)\n{\n    if (policyName.StartsWith(POLICY_PREFIX, StringComparison.OrdinalIgnoreCase))\n    {\n        var policyBuilder = new AuthorizationPolicyBuilder(\"AxSession\");\n\n        \/\/ \u0e15\u0e31\u0e14 Prefix \u0e2d\u0e2d\u0e01 (\u0e23\u0e27\u0e21\u0e16\u0e36\u0e07\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e2b\u0e21\u0e32\u0e22 : \u0e15\u0e31\u0e27\u0e41\u0e23\u0e01\u0e16\u0e49\u0e32\u0e21\u0e35)\n        var rawData = policyName.Length > POLICY_PREFIX.Length\n                      ? policyName&#91;POLICY_PREFIX.Length..&#93;\n                      : string.Empty;\n\n        if (string.IsNullOrEmpty(rawData))\n        {\n            \/\/ \u0e40\u0e04\u0e2a &#91;AxAuthorize()&#93; - \u0e44\u0e21\u0e48\u0e2a\u0e48\u0e07 parameter \u0e2d\u0e30\u0e44\u0e23\u0e21\u0e32\u0e40\u0e25\u0e22\n            \/\/ \u0e2a\u0e48\u0e07 Requirement \u0e41\u0e1a\u0e1a\u0e27\u0e48\u0e32\u0e07\u0e46 \u0e44\u0e1b\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e43\u0e2b\u0e49 Handler \u0e40\u0e0a\u0e47\u0e04\u0e41\u0e04\u0e48 Login\n            policyBuilder.AddRequirements(new AxAuthorizationRequirement(string.Empty, []));\n        }\n        else\n        {\n            \/\/ \u0e40\u0e04\u0e2a\u0e17\u0e35\u0e48\u0e21\u0e35 parameter \u0e40\u0e0a\u0e48\u0e19 \"UM-01:view:edit\" \u0e2b\u0e23\u0e37\u0e2d \"UM-01\"\n            var parts = rawData.Split(':', StringSplitOptions.RemoveEmptyEntries);\n\n            var functionId = parts&#91;0&#93;;\n            var permissions = parts.Skip(1).ToArray();\n\n            policyBuilder.AddRequirements(new AxAuthorizationRequirement(functionId, permissions));\n        }\n\n        return Task.FromResult&lt;AuthorizationPolicy?>(policyBuilder.Build());\n    }\n\n    return _fallbackPolicyProvider.GetPolicyAsync(policyName);\n}\n\n\/\/ After\npublic Task&lt;AuthorizationPolicy?> GetPolicyAsync(string policyName)\n{\n    if (policyName.StartsWith(POLICY_PREFIX, StringComparison.OrdinalIgnoreCase))\n    {\n        var policyBuilder = new AuthorizationPolicyBuilder(\"AxSession\");\n\n        \/\/ \u0e15\u0e31\u0e14 Prefix \u0e2d\u0e2d\u0e01 (\u0e23\u0e27\u0e21\u0e16\u0e36\u0e07\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e2b\u0e21\u0e32\u0e22 : \u0e15\u0e31\u0e27\u0e41\u0e23\u0e01\u0e16\u0e49\u0e32\u0e21\u0e35)\n        var rawData = policyName.Length > POLICY_PREFIX.Length\n                      ? policyName&#91;POLICY_PREFIX.Length..&#93;\n                      : string.Empty;\n\n        if (string.IsNullOrEmpty(rawData))\n        {\n            \/\/ \u0e40\u0e04\u0e2a &#91;AxAuthorize()&#93; - \u0e44\u0e21\u0e48\u0e2a\u0e48\u0e07 parameter \u0e2d\u0e30\u0e44\u0e23\u0e21\u0e32\u0e40\u0e25\u0e22\n            \/\/ \u0e2a\u0e48\u0e07 Requirement \u0e41\u0e1a\u0e1a\u0e27\u0e48\u0e32\u0e07\u0e46 \u0e44\u0e1b\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e43\u0e2b\u0e49 Handler \u0e40\u0e0a\u0e47\u0e04\u0e41\u0e04\u0e48 Login\n            policyBuilder.AddRequirements(new AxAuthorizationRequirement([], []));\n        }\n        else\n        {\n            \/\/ \u0e40\u0e04\u0e2a\u0e17\u0e35\u0e48\u0e21\u0e35 parameter \u0e40\u0e0a\u0e48\u0e19 \"UM-01:view:edit\" \u0e2b\u0e23\u0e37\u0e2d \"UM-01\"\n            var parts = rawData.Split(':', StringSplitOptions.RemoveEmptyEntries);\n\n            var functionId = parts&#91;0&#93;.Split(',', StringSplitOptions.RemoveEmptyEntries).ToArray();\n            var permissions = parts.Skip(1).ToArray();\n\n            policyBuilder.AddRequirements(new AxAuthorizationRequirement(functionId, permissions));\n        }\n\n        return Task.FromResult&lt;AuthorizationPolicy?>(policyBuilder.Build());\n    }\n\n    return _fallbackPolicyProvider.GetPolicyAsync(policyName);\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\">\/\/ Before<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">public<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">Task<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #4EC9B0\">AuthorizationPolicy<\/span><span style=\"color: #D4D4D4\">?&gt; <\/span><span style=\"color: #DCDCAA\">GetPolicyAsync<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">string<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">policyName<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">policyName<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">StartsWith<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">POLICY_PREFIX<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">StringComparison<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">OrdinalIgnoreCase<\/span><span style=\"color: #D4D4D4\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">policyBuilder<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">AuthorizationPolicyBuilder<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;AxSession&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">        \/\/ \u0e15\u0e31\u0e14 Prefix \u0e2d\u0e2d\u0e01 (\u0e23\u0e27\u0e21\u0e16\u0e36\u0e07\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e2b\u0e21\u0e32\u0e22 : \u0e15\u0e31\u0e27\u0e41\u0e23\u0e01\u0e16\u0e49\u0e32\u0e21\u0e35)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">rawData<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">policyName<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Length<\/span><span style=\"color: #D4D4D4\"> &gt; <\/span><span style=\"color: #9CDCFE\">POLICY_PREFIX<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Length<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                      ? <\/span><span style=\"color: #9CDCFE\">policyName<\/span><span style=\"color: #D4D4D4\">&#91;<\/span><span style=\"color: #9CDCFE\">POLICY_PREFIX<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Length<\/span><span style=\"color: #D4D4D4\">..&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                      : <\/span><span style=\"color: #569CD6\">string<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Empty<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">string<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">IsNullOrEmpty<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">rawData<\/span><span style=\"color: #D4D4D4\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">            \/\/ \u0e40\u0e04\u0e2a &#91;AxAuthorize()&#93; - \u0e44\u0e21\u0e48\u0e2a\u0e48\u0e07 parameter \u0e2d\u0e30\u0e44\u0e23\u0e21\u0e32\u0e40\u0e25\u0e22<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">            \/\/ \u0e2a\u0e48\u0e07 Requirement \u0e41\u0e1a\u0e1a\u0e27\u0e48\u0e32\u0e07\u0e46 \u0e44\u0e1b\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e43\u0e2b\u0e49 Handler \u0e40\u0e0a\u0e47\u0e04\u0e41\u0e04\u0e48 Login<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">policyBuilder<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">AddRequirements<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">AxAuthorizationRequirement<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">string<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Empty<\/span><span style=\"color: #D4D4D4\">, []));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">            \/\/ \u0e40\u0e04\u0e2a\u0e17\u0e35\u0e48\u0e21\u0e35 parameter \u0e40\u0e0a\u0e48\u0e19 &quot;UM-01:view:edit&quot; \u0e2b\u0e23\u0e37\u0e2d &quot;UM-01&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">parts<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">rawData<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Split<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#39;:&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">StringSplitOptions<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">RemoveEmptyEntries<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">functionId<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">parts<\/span><span style=\"color: #D4D4D4\">&#91;<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">&#93;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">permissions<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">parts<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Skip<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">ToArray<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">policyBuilder<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">AddRequirements<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">AxAuthorizationRequirement<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">functionId<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">permissions<\/span><span style=\"color: #D4D4D4\">));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">Task<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">FromResult<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #4EC9B0\">AuthorizationPolicy<\/span><span style=\"color: #D4D4D4\">?&gt;(<\/span><span style=\"color: #9CDCFE\">policyBuilder<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Build<\/span><span style=\"color: #D4D4D4\">());<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">_fallbackPolicyProvider<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">GetPolicyAsync<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">policyName<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ After<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">public<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">Task<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #4EC9B0\">AuthorizationPolicy<\/span><span style=\"color: #D4D4D4\">?&gt; <\/span><span style=\"color: #DCDCAA\">GetPolicyAsync<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">string<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">policyName<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">policyName<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">StartsWith<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">POLICY_PREFIX<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">StringComparison<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">OrdinalIgnoreCase<\/span><span style=\"color: #D4D4D4\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">policyBuilder<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">AuthorizationPolicyBuilder<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;AxSession&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">        \/\/ \u0e15\u0e31\u0e14 Prefix \u0e2d\u0e2d\u0e01 (\u0e23\u0e27\u0e21\u0e16\u0e36\u0e07\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e2b\u0e21\u0e32\u0e22 : \u0e15\u0e31\u0e27\u0e41\u0e23\u0e01\u0e16\u0e49\u0e32\u0e21\u0e35)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">rawData<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">policyName<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Length<\/span><span style=\"color: #D4D4D4\"> &gt; <\/span><span style=\"color: #9CDCFE\">POLICY_PREFIX<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Length<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                      ? <\/span><span style=\"color: #9CDCFE\">policyName<\/span><span style=\"color: #D4D4D4\">&#91;<\/span><span style=\"color: #9CDCFE\">POLICY_PREFIX<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Length<\/span><span style=\"color: #D4D4D4\">..&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                      : <\/span><span style=\"color: #569CD6\">string<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Empty<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">string<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">IsNullOrEmpty<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">rawData<\/span><span style=\"color: #D4D4D4\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">            \/\/ \u0e40\u0e04\u0e2a &#91;AxAuthorize()&#93; - \u0e44\u0e21\u0e48\u0e2a\u0e48\u0e07 parameter \u0e2d\u0e30\u0e44\u0e23\u0e21\u0e32\u0e40\u0e25\u0e22<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">            \/\/ \u0e2a\u0e48\u0e07 Requirement \u0e41\u0e1a\u0e1a\u0e27\u0e48\u0e32\u0e07\u0e46 \u0e44\u0e1b\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e43\u0e2b\u0e49 Handler \u0e40\u0e0a\u0e47\u0e04\u0e41\u0e04\u0e48 Login<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">policyBuilder<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">AddRequirements<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">AxAuthorizationRequirement<\/span><span style=\"color: #D4D4D4\">([], []));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">            \/\/ \u0e40\u0e04\u0e2a\u0e17\u0e35\u0e48\u0e21\u0e35 parameter \u0e40\u0e0a\u0e48\u0e19 &quot;UM-01:view:edit&quot; \u0e2b\u0e23\u0e37\u0e2d &quot;UM-01&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">parts<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">rawData<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Split<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#39;:&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">StringSplitOptions<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">RemoveEmptyEntries<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">functionId<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">parts<\/span><span style=\"color: #D4D4D4\">&#91;<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">&#93;.<\/span><span style=\"color: #DCDCAA\">Split<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&#39;,&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">StringSplitOptions<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">RemoveEmptyEntries<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">ToArray<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">permissions<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">parts<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Skip<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">ToArray<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">policyBuilder<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">AddRequirements<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">new<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">AxAuthorizationRequirement<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">functionId<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">permissions<\/span><span style=\"color: #D4D4D4\">));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">Task<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">FromResult<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #4EC9B0\">AuthorizationPolicy<\/span><span style=\"color: #D4D4D4\">?&gt;(<\/span><span style=\"color: #9CDCFE\">policyBuilder<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Build<\/span><span style=\"color: #D4D4D4\">());<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">_fallbackPolicyProvider<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">GetPolicyAsync<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">policyName<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>4. \u0e17\u0e35\u0e48 <strong>AxAuthorizationHandler.cs<\/strong> \u0e1b\u0e23\u0e31\u0e1a logic \u0e01\u0e32\u0e23\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e4c<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-Fira-Code\" style=\"font-size:.875rem;font-family:Code-Pro-Fira-Code,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ Before\nprotected override Task HandleRequirementAsync(\nAuthorizationHandlerContext context,\nAxAuthorizationRequirement requirement)\n{\n    if (context.User == null || !(context.User.Identity?.IsAuthenticated ?? false))\n    {\n        context.Fail();\n        return Task.CompletedTask;\n    }\n\n    var functionId = requirement.FunctionId;\n    var reqPermissions = requirement.Permissions;\n\n    if (string.IsNullOrEmpty(functionId))\n    {\n        context.Succeed(requirement);\n        return Task.CompletedTask;\n    }\n\n    var permissions = context.User.Claims\n        .Where(c => c.Type == \"permission\")\n        .Select(c => c.Value);\n\n    if (reqPermissions == null || reqPermissions.Length == 0)\n    {\n        var hasAnyInFunction = permissions.Any(p =>\n            p.Contains($\":{functionId}:\", StringComparison.OrdinalIgnoreCase) ||\n            p.EndsWith($\":{functionId}\", StringComparison.OrdinalIgnoreCase));\n\n        if (hasAnyInFunction)\n        {\n            context.Succeed(requirement);\n        }\n        return Task.CompletedTask;\n    }\n\n    var hasAtLeastOne = reqPermissions.Any(reqPerm =>\n        permissions.Any(p => p.EndsWith($\":{functionId}:{reqPerm}\",\n            StringComparison.OrdinalIgnoreCase))\n    );\n\n    if (hasAtLeastOne)\n    {\n        context.Succeed(requirement);\n    }\n\n    return Task.CompletedTask;\n}\n\n\/\/ After\nprotected override Task HandleRequirementAsync(\n    AuthorizationHandlerContext context,\n    AxAuthorizationRequirement requirement)\n{\n    \/\/ 1. \u0e1e\u0e37\u0e49\u0e19\u0e10\u0e32\u0e19\u0e17\u0e35\u0e48\u0e2a\u0e38\u0e14: \u0e15\u0e49\u0e2d\u0e07 Login \u0e01\u0e48\u0e2d\u0e19\u0e40\u0e2a\u0e21\u0e2d\n    if (context.User == null || !(context.User.Identity?.IsAuthenticated ?? false))\n    {\n        context.Fail();\n        return Task.CompletedTask;\n    }\n\n    var functionIds = requirement.FunctionId;\n    var reqPermissions = requirement.Permissions;\n\n    \/\/ \u0e40\u0e04\u0e2a\u0e17\u0e35\u0e48 1: &#91;AxAuthorize()&#93; - \u0e44\u0e21\u0e48\u0e23\u0e30\u0e1a\u0e38 FunctionId \u0e40\u0e25\u0e22\n    if (functionIds == null || functionIds.Length == 0)\n    {\n        context.Succeed(requirement);\n        return Task.CompletedTask;\n    }\n\n    var userPermissions = context.User.Claims\n        .Where(c => c.Type == \"permission\")\n        .Select(c => c.Value)\n        .ToList();\n\n    \/\/ \u0e40\u0e04\u0e2a\u0e17\u0e35\u0e48 2: [AxAuthorize(&#91;\"UM-01\", \"UM-02\"&#93;)] - \u0e23\u0e30\u0e1a\u0e38\u0e41\u0e04\u0e48 FunctionIds \u0e41\u0e15\u0e48\u0e44\u0e21\u0e48\u0e23\u0e30\u0e1a\u0e38 Permission \u0e40\u0e09\u0e1e\u0e32\u0e30\u0e40\u0e08\u0e32\u0e30\u0e08\u0e07\n    \/\/ \u0e40\u0e0a\u0e47\u0e04\u0e27\u0e48\u0e32 User \u0e21\u0e35\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e4c\u0e43\u0e14\u0e46 \u0e43\u0e19\u0e1f\u0e31\u0e07\u0e01\u0e4c\u0e0a\u0e31\u0e19\u0e43\u0e14\u0e1f\u0e31\u0e07\u0e01\u0e4c\u0e0a\u0e31\u0e19\u0e2b\u0e19\u0e36\u0e48\u0e07\u0e43\u0e19\u0e25\u0e34\u0e2a\u0e15\u0e4c\u0e19\u0e35\u0e49\u0e2b\u0e23\u0e37\u0e2d\u0e44\u0e21\u0e48\n    if (reqPermissions == null || reqPermissions.Length == 0)\n    {\n        var hasAnyInFunctions = functionIds.Any(fId =>\n            userPermissions.Any(p =>\n                p.Contains($\":{fId}:\", StringComparison.OrdinalIgnoreCase) ||\n                p.EndsWith($\":{fId}\", StringComparison.OrdinalIgnoreCase))\n        );\n\n        if (hasAnyInFunctions)\n        {\n            context.Succeed(requirement);\n        }\n        return Task.CompletedTask;\n    }\n\n    \/\/ \u0e40\u0e04\u0e2a\u0e17\u0e35\u0e48 3: [AxAuthorize(&#91;\"UM-01\", \"UM-02\"&#93;, \"view\", \"edit\")] - \u0e23\u0e30\u0e1a\u0e38\u0e04\u0e23\u0e1a\n    \/\/ \u0e40\u0e0a\u0e47\u0e04\u0e41\u0e1a\u0e1a OR: \u0e21\u0e35 Permission \u0e43\u0e14\u0e43\u0e19 Function \u0e43\u0e14 \u0e01\u0e47\u0e16\u0e37\u0e2d\u0e27\u0e48\u0e32\u0e1c\u0e48\u0e32\u0e19\n    var hasMatch = functionIds.Any(fId =>\n        reqPermissions.Any(reqPerm =>\n            userPermissions.Any(p => \n                p.EndsWith($\":{fId}:{reqPerm}\", StringComparison.OrdinalIgnoreCase))\n        )\n    );\n\n    if (hasMatch)\n    {\n        context.Succeed(requirement);\n    }\n\n    return Task.CompletedTask;\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\">\/\/ Before<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">protected<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">override<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">Task<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">HandleRequirementAsync<\/span><span style=\"color: #D4D4D4\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #4EC9B0\">AuthorizationHandlerContext<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">context<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #4EC9B0\">AxAuthorizationRequirement<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">requirement<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">context<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">User<\/span><span style=\"color: #D4D4D4\"> == <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\"> || !(<\/span><span style=\"color: #9CDCFE\">context<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">User<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Identity<\/span><span style=\"color: #D4D4D4\">?.<\/span><span style=\"color: #9CDCFE\">IsAuthenticated<\/span><span style=\"color: #D4D4D4\"> ?? <\/span><span style=\"color: #569CD6\">false<\/span><span style=\"color: #D4D4D4\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">context<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Fail<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">Task<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">CompletedTask<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">functionId<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">requirement<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">FunctionId<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">reqPermissions<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">requirement<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Permissions<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">string<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">IsNullOrEmpty<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">functionId<\/span><span style=\"color: #D4D4D4\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">context<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Succeed<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">requirement<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">Task<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">CompletedTask<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">permissions<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">context<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">User<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Claims<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        .<\/span><span style=\"color: #DCDCAA\">Where<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">c<\/span><span style=\"color: #D4D4D4\"> =&gt; <\/span><span style=\"color: #9CDCFE\">c<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Type<\/span><span style=\"color: #D4D4D4\"> == <\/span><span style=\"color: #CE9178\">&quot;permission&quot;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        .<\/span><span style=\"color: #DCDCAA\">Select<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">c<\/span><span style=\"color: #D4D4D4\"> =&gt; <\/span><span style=\"color: #9CDCFE\">c<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Value<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">reqPermissions<\/span><span style=\"color: #D4D4D4\"> == <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #9CDCFE\">reqPermissions<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Length<\/span><span style=\"color: #D4D4D4\"> == <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">hasAnyInFunction<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">permissions<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Any<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">p<\/span><span style=\"color: #D4D4D4\"> =&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">p<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Contains<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">$&quot;:{<\/span><span style=\"color: #9CDCFE\">functionId<\/span><span style=\"color: #CE9178\">}:&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">StringComparison<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">OrdinalIgnoreCase<\/span><span style=\"color: #D4D4D4\">) ||<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">p<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">EndsWith<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">$&quot;:{<\/span><span style=\"color: #9CDCFE\">functionId<\/span><span style=\"color: #CE9178\">}&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">StringComparison<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">OrdinalIgnoreCase<\/span><span style=\"color: #D4D4D4\">));<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">hasAnyInFunction<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">context<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Succeed<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">requirement<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">Task<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">CompletedTask<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">hasAtLeastOne<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">reqPermissions<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Any<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">reqPerm<\/span><span style=\"color: #D4D4D4\"> =&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">permissions<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Any<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">p<\/span><span style=\"color: #D4D4D4\"> =&gt; <\/span><span style=\"color: #9CDCFE\">p<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">EndsWith<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">$&quot;:{<\/span><span style=\"color: #9CDCFE\">functionId<\/span><span style=\"color: #CE9178\">}:{<\/span><span style=\"color: #9CDCFE\">reqPerm<\/span><span style=\"color: #CE9178\">}&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">StringComparison<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">OrdinalIgnoreCase<\/span><span style=\"color: #D4D4D4\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    );<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">hasAtLeastOne<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">context<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Succeed<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">requirement<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">Task<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">CompletedTask<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ After<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">protected<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">override<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">Task<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">HandleRequirementAsync<\/span><span style=\"color: #D4D4D4\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #4EC9B0\">AuthorizationHandlerContext<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">context<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #4EC9B0\">AxAuthorizationRequirement<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">requirement<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">    \/\/ 1. \u0e1e\u0e37\u0e49\u0e19\u0e10\u0e32\u0e19\u0e17\u0e35\u0e48\u0e2a\u0e38\u0e14: \u0e15\u0e49\u0e2d\u0e07 Login \u0e01\u0e48\u0e2d\u0e19\u0e40\u0e2a\u0e21\u0e2d<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">context<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">User<\/span><span style=\"color: #D4D4D4\"> == <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\"> || !(<\/span><span style=\"color: #9CDCFE\">context<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">User<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Identity<\/span><span style=\"color: #D4D4D4\">?.<\/span><span style=\"color: #9CDCFE\">IsAuthenticated<\/span><span style=\"color: #D4D4D4\"> ?? <\/span><span style=\"color: #569CD6\">false<\/span><span style=\"color: #D4D4D4\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">context<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Fail<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">Task<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">CompletedTask<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">functionIds<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">requirement<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">FunctionId<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">reqPermissions<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">requirement<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Permissions<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">    \/\/ \u0e40\u0e04\u0e2a\u0e17\u0e35\u0e48 1: &#91;AxAuthorize()&#93; - \u0e44\u0e21\u0e48\u0e23\u0e30\u0e1a\u0e38 FunctionId \u0e40\u0e25\u0e22<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">functionIds<\/span><span style=\"color: #D4D4D4\"> == <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #9CDCFE\">functionIds<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Length<\/span><span style=\"color: #D4D4D4\"> == <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">context<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Succeed<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">requirement<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">Task<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">CompletedTask<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">userPermissions<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">context<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">User<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Claims<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        .<\/span><span style=\"color: #DCDCAA\">Where<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">c<\/span><span style=\"color: #D4D4D4\"> =&gt; <\/span><span style=\"color: #9CDCFE\">c<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Type<\/span><span style=\"color: #D4D4D4\"> == <\/span><span style=\"color: #CE9178\">&quot;permission&quot;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        .<\/span><span style=\"color: #DCDCAA\">Select<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">c<\/span><span style=\"color: #D4D4D4\"> =&gt; <\/span><span style=\"color: #9CDCFE\">c<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Value<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        .<\/span><span style=\"color: #DCDCAA\">ToList<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">    \/\/ \u0e40\u0e04\u0e2a\u0e17\u0e35\u0e48 2: [AxAuthorize(&#91;&quot;UM-01&quot;, &quot;UM-02&quot;&#93;)] - \u0e23\u0e30\u0e1a\u0e38\u0e41\u0e04\u0e48 FunctionIds \u0e41\u0e15\u0e48\u0e44\u0e21\u0e48\u0e23\u0e30\u0e1a\u0e38 Permission \u0e40\u0e09\u0e1e\u0e32\u0e30\u0e40\u0e08\u0e32\u0e30\u0e08\u0e07<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">    \/\/ \u0e40\u0e0a\u0e47\u0e04\u0e27\u0e48\u0e32 User \u0e21\u0e35\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e4c\u0e43\u0e14\u0e46 \u0e43\u0e19\u0e1f\u0e31\u0e07\u0e01\u0e4c\u0e0a\u0e31\u0e19\u0e43\u0e14\u0e1f\u0e31\u0e07\u0e01\u0e4c\u0e0a\u0e31\u0e19\u0e2b\u0e19\u0e36\u0e48\u0e07\u0e43\u0e19\u0e25\u0e34\u0e2a\u0e15\u0e4c\u0e19\u0e35\u0e49\u0e2b\u0e23\u0e37\u0e2d\u0e44\u0e21\u0e48<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">reqPermissions<\/span><span style=\"color: #D4D4D4\"> == <\/span><span style=\"color: #569CD6\">null<\/span><span style=\"color: #D4D4D4\"> || <\/span><span style=\"color: #9CDCFE\">reqPermissions<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">Length<\/span><span style=\"color: #D4D4D4\"> == <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">hasAnyInFunctions<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">functionIds<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Any<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">fId<\/span><span style=\"color: #D4D4D4\"> =&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">userPermissions<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Any<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">p<\/span><span style=\"color: #D4D4D4\"> =&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #9CDCFE\">p<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Contains<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">$&quot;:{<\/span><span style=\"color: #9CDCFE\">fId<\/span><span style=\"color: #CE9178\">}:&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">StringComparison<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">OrdinalIgnoreCase<\/span><span style=\"color: #D4D4D4\">) ||<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #9CDCFE\">p<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">EndsWith<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">$&quot;:{<\/span><span style=\"color: #9CDCFE\">fId<\/span><span style=\"color: #CE9178\">}&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">StringComparison<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">OrdinalIgnoreCase<\/span><span style=\"color: #D4D4D4\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        );<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">hasAnyInFunctions<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">context<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Succeed<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">requirement<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">Task<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">CompletedTask<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">    \/\/ \u0e40\u0e04\u0e2a\u0e17\u0e35\u0e48 3: [AxAuthorize(&#91;&quot;UM-01&quot;, &quot;UM-02&quot;&#93;, &quot;view&quot;, &quot;edit&quot;)] - \u0e23\u0e30\u0e1a\u0e38\u0e04\u0e23\u0e1a<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">    \/\/ \u0e40\u0e0a\u0e47\u0e04\u0e41\u0e1a\u0e1a OR: \u0e21\u0e35 Permission \u0e43\u0e14\u0e43\u0e19 Function \u0e43\u0e14 \u0e01\u0e47\u0e16\u0e37\u0e2d\u0e27\u0e48\u0e32\u0e1c\u0e48\u0e32\u0e19<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">var<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">hasMatch<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #9CDCFE\">functionIds<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Any<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">fId<\/span><span style=\"color: #D4D4D4\"> =&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">reqPermissions<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Any<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">reqPerm<\/span><span style=\"color: #D4D4D4\"> =&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">userPermissions<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Any<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">p<\/span><span style=\"color: #D4D4D4\"> =&gt; <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #9CDCFE\">p<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">EndsWith<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">$&quot;:{<\/span><span style=\"color: #9CDCFE\">fId<\/span><span style=\"color: #CE9178\">}:{<\/span><span style=\"color: #9CDCFE\">reqPerm<\/span><span style=\"color: #CE9178\">}&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">StringComparison<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">OrdinalIgnoreCase<\/span><span style=\"color: #D4D4D4\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    );<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">hasMatch<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">context<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">Succeed<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">requirement<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">Task<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">CompletedTask<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\u0e41\u0e04\u0e48\u0e19\u0e35\u0e49\u0e04\u0e38\u0e13\u0e01\u0e47\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e4c\u0e41\u0e1a\u0e1a FunctionId \u0e21\u0e32\u0e01\u0e01\u0e27\u0e48\u0e32 1 \u0e44\u0e14\u0e49\u0e41\u0e25\u0e49\u0e27<\/p>\n","protected":false},"featured_media":0,"parent":1181,"menu_order":6,"comment_status":"open","ping_status":"closed","template":"","meta":{"nav_title":"","positive":"","negative":"","footnotes":""},"docs_category":[],"class_list":["post-4174","docs","type-docs","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/portal-atlasx.cdg.co.th\/home\/wp-json\/wp\/v2\/docs\/4174","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/portal-atlasx.cdg.co.th\/home\/wp-json\/wp\/v2\/docs"}],"about":[{"href":"https:\/\/portal-atlasx.cdg.co.th\/home\/wp-json\/wp\/v2\/types\/docs"}],"replies":[{"embeddable":true,"href":"https:\/\/portal-atlasx.cdg.co.th\/home\/wp-json\/wp\/v2\/comments?post=4174"}],"version-history":[{"count":22,"href":"https:\/\/portal-atlasx.cdg.co.th\/home\/wp-json\/wp\/v2\/docs\/4174\/revisions"}],"predecessor-version":[{"id":4236,"href":"https:\/\/portal-atlasx.cdg.co.th\/home\/wp-json\/wp\/v2\/docs\/4174\/revisions\/4236"}],"up":[{"embeddable":true,"href":"https:\/\/portal-atlasx.cdg.co.th\/home\/wp-json\/wp\/v2\/docs\/1181"}],"wp:attachment":[{"href":"https:\/\/portal-atlasx.cdg.co.th\/home\/wp-json\/wp\/v2\/media?parent=4174"}],"wp:term":[{"taxonomy":"docs_category","embeddable":true,"href":"https:\/\/portal-atlasx.cdg.co.th\/home\/wp-json\/wp\/v2\/docs_category?post=4174"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}