返回頂部
關閉軟件導航
位置:首頁 > 資訊 > 其他>策略實際上允許角色為內容編輯者或高級用戶的用戶

  光定義策略還不夠,還必須向授權中間件注冊策略。為此,請在 Startup 類的 ConfigureServices 方法中,將授權中間件添加為服務,如下所示:

  services.AddAuthorization(options=>{ options.AddPolicy("ContentsEditor", policy => { policy.AddAuthenticationSchemes("Cookie, Bearer"); policy.RequireAuthenticatedUser(); policy.RequireRole("Admin"); policy.RequireClaim("editor", "contents"); });}

  添加到中間件的每個策略都有一個名稱,用于在 Controller 類的 Authorize 屬性中引用策略:

  [Authorize(Policy = "ContentsEditor")]publicIActionResult Save(Article article){ // ...}

  使用 Authorize 屬性,可以聲明的方式設置策略,但也可以通過操作方法以編程方式調用策略,如圖 2所示。

  圖 2:以編程方式檢查策略

  publicclassAdminController : Controller{ privateIAuthorizationService _authorization; publicAdminController(IAuthorizationService authorizationService) { _authorization = authorizationService; } publicasyncTask{ options.AddPolicy("ContentsEditor", policy => { policy.AddAuthenticationSchemes("Cookie, Bearer"); policy.RequireAuthenticatedUser(); policy.RequireRole("Admin"); policy.RequireClaim("editor", "contents"); });}

  添加到中間件的每個策略都有一個名稱,用于在 Controller 類的 Authorize 屬性中引用策略:

  [Authorize(Policy = "ContentsEditor")]publicIActionResult Save(Article article){ // ...}

  使用 Authorize 屬性,可以聲明的方式設置策略,但也可以通過操作方法以編程方式調用策略,如圖 2所示。

  圖 2:以編程方式檢查策略

  publicclassAdminController : Controller{ privateIAuthorizationService _authorization; publicAdminController(IAuthorizationService authorizationService) { _authorization = authorizationService; } publicasyncTask { policy.AddAuthenticationSchemes("Cookie, Bearer"); policy.RequireAuthenticatedUser(); policy.RequireRole("Admin"); policy.RequireClaim("editor", "contents"); });}

  添加到中間件的每個策略都有一個名稱ASPCMS批量添加產品 ,用于在 Controller 類的 Authorize 屬性中引用策略:

  [Authorize(Policy = "ContentsEditor")]publicIActionResult Save(Article article){ // ...}

  使用 Authorize 屬性,可以聲明的方式設置策略,但也可以通過操作方法以編程方式調用策略,如圖 2所示。

  圖 2:以編程方式檢查策略

  publicclassAdminController : Controller{ privateIAuthorizationService _authorization; publicAdminController(IAuthorizationService authorizationService) { _authorization = authorizationService; } publicasyncTask Save(Article article) { varallowed = await_authorization.AuthorizeAsync( User, "ContentsEditor")); if(!allowed) returnnewForbiddenResult(); // Proceed with the method implementation ... }}

  如果無法以編程方式檢查權限,建議返回 ForbiddenResult 對象。另一種選擇是,返回 ChallengeResult 對象。

  在 ASP.NET Core 1.x 中ASPCMS批量刪除關鍵詞 ,返回質詢會指示授權中間件返回 401 狀態代碼,或將用戶重定向到登錄頁,具體視配置而定。

  不過,ASP.NET Core 2.0 中不會發生重定向;即使在 ASP.NET Core 1.x 中,如果用戶已登錄,質詢最終也會指示返回 ForbiddenResult 對象。最后看來,最好的方法是在無法檢查權限時返回 ForbiddenResult 對象。

  請注意,甚至可以在 Razor 視圖中以編程方式檢查策略,如下面的代碼所示:

  @{ varauthorized = awaitAuthorization.AuthorizeAsync( User, "ContentsEditor"))}@if(!authorized){  You’re not authorized to access thispage.

  }

  不過,為了讓此代碼能夠正常運行,必須先注入對授權服務的依賴ASPCMS批量上傳內容 ,如下所示:

  @inject IAuthorizationService Authorization

  在視圖中使用授權服務,有助于隱藏當前用戶在給定上下文中不得接觸到的 UI 元素。但請注意,光在視圖中隱藏選項還不夠。始終還需要在控制器中強制執行策略。

  自定義要求

  常備要求基本上涵蓋了聲明、身份驗證,并提供了常規用途機制,用于根據斷言進行自定義,但也可以創建自定義要求。

  策略要求由以下兩種元素組成:僅保留數據的要求類,以及對用戶驗證數據的授權處理程序。創建自定義要求,還可以進一步表達特定策略。例如,假設要將內容編輯者策略擴展為,增添用戶至少必須有三年經驗的要求。具體代碼如下:

  publicclassExperienceRequirement : IAuthorizationRequirement{ publicintYears { get; privateset; } publicExperienceRequirement(intminimumYears) { Years = minimumYears; }}

  要求至少必須有一個授權處理程序。處理程序的類型為 AuthorizationHandler,其中 T 是要求類型。圖 3 展示了 ExperienceRequirement 類型的示例處理程序。

  圖 3:示例授權處理程序

  publicclassExperienceHandler : AuthorizationHandler{ protectedoverrideTask HandleRequirementAsync( AuthorizationHandlerContext context, ExperienceRequirement requirement) { // Save User object to access claimsvaruser = context.User; if(!user.HasClaim(c => c.Type == "EditorSince")) returnTask.CompletedTask; varsince = user.FindFirst("EditorSince").Value.ToInt(); if(since >= requirement.Years) context.Succeed(requirement); returnTask.CompletedTask; }}

  示例授權處理程序讀取與用戶關聯的聲明,并檢查自定義 EditorSince 聲明。如果找不到,處理程序便無法返回成功。只有在找到聲明且包含的整數值不低于指定年數時,才能返回成功。

  自定義聲明應為一條信息,以某種方式與保存到身份驗證 Cookie 中的用戶相關聯(例如,“用戶”表中的列)。

  不過,一旦保留對用戶的引用,便始終可以從聲明中找到用戶名,并對任何數據庫或外部服務運行查詢,以獲取經驗年數,從而在處理程序中使用此信息。(我承認,如果 EditorSince 值保留 DateTime,并計算用戶擔任編輯者是否已有一定年數,此示例會更真實一點。)

  授權處理程序調用方法 Succeed,同時傳遞當前要求,以通知此要求已成功得到驗證。如果沒有傳遞要求,處理程序無需執行任何操作,可以直接返回內容。不過,如果處理程序要確定是否不符合要求(無論其他處理程序是否已成功驗證同一要求),將會對授權上下文對象調用方法 Fail。

  下面展示了如何將自定義要求添加到策略(請注意,由于這是自定義要求,因此沒有擴展方法,而必須繼續處理策略對象的整個 Requirements 集合):

  services.AddAuthorization(options =>{ options.AddPolicy("AtLeast3Years", policy => policy .Requirements .Add(newExperienceRequirement(3)));});

  此外,還需要在 IAuthorizationHandler 類型的范圍內向 DI 系統注冊新的處理程序:

  services.AddSingleton c.Type == "EditorSince")) returnTask.CompletedTask; varsince = user.FindFirst("EditorSince").Value.ToInt(); if(since >= requirement.Years) context.Succeed(requirement); returnTask.CompletedTask; }}

  示例授權處理程序讀取與用戶關聯的聲明,并檢查自定義 EditorSince 聲明。如果找不到,處理程序便無法返回成功。只有在找到聲明且包含的整數值不低于指定年數時,才能返回成功。

  自定義聲明應為一條信息,以某種方式與保存到身份驗證 Cookie 中的用戶相關聯(例如,“用戶”表中的列)。

  不過,一旦保留對用戶的引用,便始終可以從聲明中找到用戶名ASPCMS批量更新文章,并對任何數據庫或外部服務運行查詢,以獲取經驗年數,從而在處理程序中使用此信息。(我承認,如果 EditorSince 值保留 DateTime,并計算用戶擔任編輯者是否已有一定年數,此示例會更真實一點。)

  授權處理程序調用方法 Succeed,同時傳遞當前要求,以通知此要求已成功得到驗證。如果沒有傳遞要求,處理程序無需執行任何操作,可以直接返回內容。不過,如果處理程序要確定是否不符合要求(無論其他處理程序是否已成功驗證同一要求),將會對授權上下文對象調用方法 Fail。

  下面展示了如何將自定義要求添加到策略(請注意,由于這是自定義要求,因此沒有擴展方法,而必須繼續處理策略對象的整個 Requirements 集合):

  services.AddAuthorization(options =>{ options.AddPolicy("AtLeast3Years", policy => policy .Requirements .Add(newExperienceRequirement(3)));});

  此外,還需要在 IAuthorizationHandler 類型的范圍內向 DI 系統注冊新的處理程序:

  services.AddSingleton= requirement.Years) context.Succeed(requirement); returnTask.CompletedTask; }}

  示例授權處理程序讀取與用戶關聯的聲明,并檢查自定義 EditorSince 聲明。如果找不到,處理程序便無法返回成功。只有在找到聲明且包含的整數值不低于指定年數時,才能返回成功。

  自定義聲明應為一條信息,以某種方式與保存到身份驗證 Cookie 中的用戶相關聯(例如,“用戶”表中的列)。

  不過,一旦保留對用戶的引用,便始終可以從聲明中找到用戶名,并對任何數據庫或外部服務運行查詢,以獲取經驗年數,從而在處理程序中使用此信息。(我承認,如果 EditorSince 值保留 DateTime,并計算用戶擔任編輯者是否已有一定年數,此示例會更真實一點。)

  授權處理程序調用方法 Succeed,同時傳遞當前要求,以通知此要求已成功得到驗證。如果沒有傳遞要求,處理程序無需執行任何操作,可以直接返回內容。不過,如果處理程序要確定是否不符合要求(無論其他處理程序是否已成功驗證同一要求),將會對授權上下文對象調用方法 Fail。

  下面展示了如何將自定義要求添加到策略(請注意,由于這是自定義要求,因此沒有擴展方法,而必須繼續處理策略對象的整個 Requirements 集合):

  services.AddAuthorization(options =>{ options.AddPolicy("AtLeast3Years", policy => policy .Requirements .Add(newExperienceRequirement(3)));});

  此外,還需要在 IAuthorizationHandler 類型的范圍內向 DI 系統注冊新的處理程序:

ASPCMS批量添加欄目

  services.AddSingleton{ options.AddPolicy("AtLeast3Years", policy => policy .Requirements .Add(newExperienceRequirement(3)));});

  此外,還需要在 IAuthorizationHandler 類型的范圍內向 DI 系統注冊新的處理程序:

  services.AddSingleton policy .Requirements .Add(newExperienceRequirement(3)));});

  此外,還需要在 IAuthorizationHandler 類型的范圍內向 DI 系統注冊新的處理程序:

  services.AddSingleton();

  如前所述,要求可包含多個處理程序。如果為授權層的同一要求向 DI 系統注冊多個處理程序,有一個成功就足夠了。

  訪問當前 HttpContext

  在實現授權處理程序的過程中,可能需要檢查請求屬性或路由數據,如下所示:

  if(context.Resource isAuthorizationFilterContext mvc){ varurl = mvc.HttpContext.Request.GetDisplayUrl(); ...}

  在 ASP.NET Core 中,AuthorizationHandlerContext 對象向 FilterContext 對象公開 Resource 屬性集。上下文對象因所涉及的框架而異。例如,MVC 和 SignalR 發送自己的特定對象。是否發生轉換視需要訪問的內容而定。例如,用戶信息始終可用,所以無需為此進行轉換;但若要獲取 MVC 專屬詳細信息(如路由信息),則需要進行轉換。

  總結

  在 ASP.NET Core 中,授權分為兩種。一種是基于角色的傳統授權,它的工作原理與在經典 ASP.NET MVC 中的工作原理相同,但仍存在相當平面化的結構限制,不適合表達復雜的授權邏輯。

  基于策略的身份驗證是一種新方法,可提供更豐富、更易表達的模型。這是因為,策略包含一系列基于聲明的要求,以及基于可從 HTTP 上下文或外部源注入的其他任何信息的自定義邏輯。這些要求各自與一個或多個處理程序相關聯,這些處理程序負責要求的實際計算。

  Dino Esposito是《Microsoft .NET:構建面向企業的應用程序》(Microsoft Press,2014 年)和《使用 ASP.NET 構建新型 Web 應用程序》(Microsoft Press,2016 年)的作者。作為 JetBrains 的 .NET 和 Android 平臺的技術推廣人員,Esposito 經常在全球行業活動中發表演講,并在 software2cents@wordpress.com 上以及 Twitter @despos 上的推文中分享他對于軟件的愿景。

如果您覺得 策略實際上允許角色為內容編輯者或高級用戶的用戶 這篇文章對您有用,請分享給您的好友,謝謝
文章地址:http://www.meyanliao.com/article/other/clsjsyxjswnrbjzhgjyhdyh.html
解放雙手無盡可能,有問題添加天線貓微信
主站蜘蛛池模板: 日韩精品无码免费一区二区三区 | 中文字幕久无码免费久久| 无码精品黑人一区二区三区| 无码人妻久久久一区二区三区| 永久免费av无码网站韩国毛片| h无码动漫在线观看| 久久久久久亚洲AV无码专区| 色欲aⅴ亚洲情无码AV| 日韩网红少妇无码视频香港| 精品无码黑人又粗又大又长 | 无码国产69精品久久久久孕妇 | 亚洲国产精品无码久久九九| 人妻aⅴ无码一区二区三区| 免费看成人AA片无码视频吃奶| 无码人妻丝袜在线视频| 国产Av激情久久无码天堂| 青春草无码精品视频在线观| 亚洲熟妇无码av另类vr影视| 国产精品无码AV一区二区三区| 曰韩无码AV片免费播放不卡| 爆乳无码AV一区二区三区| 亚洲AV无码成人网站在线观看| 无码成A毛片免费| 国产成年无码久久久免费| 国产精品无码免费专区午夜| 无翼乌工口肉肉无遮挡无码18| 欧洲精品无码成人久久久| 亚洲综合一区无码精品| 久久久久亚洲Av无码专| 熟妇无码乱子成人精品| 亚洲人成影院在线无码按摩店| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 国产精品亚洲аv无码播放| 天码av无码一区二区三区四区 | 免费无码一区二区三区| 在线播放无码高潮的视频| 国产av无码专区亚洲av桃花庵| 亚洲日韩v无码中文字幕| 亚洲AV无码久久精品成人| 亚洲AV无码乱码在线观看裸奔| 亚洲综合无码精品一区二区三区|