發(fā)布時間:2018-07-16
欄目:其他
光定義策略還不夠,還必須向授權(quán)中間件注冊策略能力建設。為此戰略布局,請在 Startup 類的 ConfigureServices 方法中,將授權(quán)中間件添加為服務表現明顯更佳,如下所示:
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 屬性,可以聲明的方式設(shè)置策略指導,但也可以通過操作方法以編程方式調(diào)用策略廣泛認同,如圖 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 屬性鍛造,可以聲明的方式設(shè)置策略,但也可以通過操作方法以編程方式調(diào)用策略持續創新,如圖 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批量添加產(chǎn)品 ,用于在 Controller 類的 Authorize 屬性中引用策略:
[Authorize(Policy = "ContentsEditor")]publicIActionResult Save(Article article){ // ...}
使用 Authorize 屬性協調機製,可以聲明的方式設(shè)置策略信息化,但也可以通過操作方法以編程方式調(diào)用策略,如圖 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 ... }}
如果無法以編程方式檢查權(quán)限充分發揮,建議返回 ForbiddenResult 對象。另一種選擇是管理,返回 ChallengeResult 對象。
在 ASP.NET Core 1.x 中ASPCMS批量刪除關(guān)鍵詞 ,返回質(zhì)詢會指示授權(quán)中間件返回 401 狀態(tài)代碼改進措施,或?qū)⒂脩糁囟ㄏ虻降卿涰摼痛讼崎_,具體視配置而定。
不過今年,ASP.NET Core 2.0 中不會發(fā)生重定向穩步前行;即使在 ASP.NET Core 1.x 中,如果用戶已登錄動手能力,質(zhì)詢最終也會指示返回 ForbiddenResult 對象逐步改善。最后看來,最好的方法是在無法檢查權(quán)限時返回 ForbiddenResult 對象提升。
請注意大大提高,甚至可以在 Razor 視圖中以編程方式檢查策略,如下面的代碼所示:
@{ varauthorized = awaitAuthorization.AuthorizeAsync( User, "ContentsEditor"))}@if(!authorized){ You’re not authorized to access thispage.
}
不過研究成果,為了讓此代碼能夠正常運行產品和服務,必須先注入對授權(quán)服務的依賴ASPCMS批量上傳內(nèi)容 ,如下所示:
@inject IAuthorizationService Authorization
在視圖中使用授權(quán)服務體驗區,有助于隱藏當前用戶在給定上下文中不得接觸到的 UI 元素增多。但請注意,光在視圖中隱藏選項還不夠有望。始終還需要在控制器中強制執(zhí)行策略進一步推進。
自定義要求
常備要求基本上涵蓋了聲明、身份驗證方案,并提供了常規(guī)用途機制應用的選擇,用于根據(jù)斷言進行自定義,但也可以創(chuàng)建自定義要求即將展開。
策略要求由以下兩種元素組成:僅保留數(shù)據(jù)的要求類大幅增加,以及對用戶驗證數(shù)據(jù)的授權(quán)處理程序。創(chuàng)建自定義要求傳承,還可以進一步表達特定策略等特點。例如,假設(shè)要將內(nèi)容編輯者策略擴展為多種,增添用戶至少必須有三年經(jīng)驗的要求將進一步。具體代碼如下:
publicclassExperienceRequirement : IAuthorizationRequirement{ publicintYears { get; privateset; } publicExperienceRequirement(intminimumYears) { Years = minimumYears; }}
要求至少必須有一個授權(quán)處理程序。處理程序的類型為 AuthorizationHandler發展成就,其中 T 是要求類型成就。圖 3 展示了 ExperienceRequirement 類型的示例處理程序。
圖 3:示例授權(quán)處理程序
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; }}
示例授權(quán)處理程序讀取與用戶關(guān)聯(lián)的聲明開展面對面,并檢查自定義 EditorSince 聲明系統。如果找不到,處理程序便無法返回成功。只有在找到聲明且包含的整數(shù)值不低于指定年數(shù)時空間廣闊,才能返回成功營造一處。
自定義聲明應為一條信息,以某種方式與保存到身份驗證 Cookie 中的用戶相關(guān)聯(lián)(例如知識和技能,“用戶”表中的列)取得顯著成效。
不過,一旦保留對用戶的引用實現,便始終可以從聲明中找到用戶名不容忽視,并對任何數(shù)據(jù)庫或外部服務運行查詢,以獲取經(jīng)驗年數(shù)可以使用,從而在處理程序中使用此信息進入當下。(我承認,如果 EditorSince 值保留 DateTime應用領域,并計算用戶擔任編輯者是否已有一定年數(shù)保持競爭優勢,此示例會更真實一點。)
授權(quán)處理程序調(diào)用方法 Succeed發展機遇,同時傳遞當前要求長效機製,以通知此要求已成功得到驗證。如果沒有傳遞要求全技術方案,處理程序無需執(zhí)行任何操作分享,可以直接返回內(nèi)容。不過信息化,如果處理程序要確定是否不符合要求(無論其他處理程序是否已成功驗證同一要求)方式之一,將會對授權(quán)上下文對象調(diào)用方法 Fail。
下面展示了如何將自定義要求添加到策略(請注意新型儲能,由于這是自定義要求創新能力,因此沒有擴展方法,而必須繼續(xù)處理策略對象的整個 Requirements 集合):
services.AddAuthorization(options =>{ options.AddPolicy("AtLeast3Years", policy => policy .Requirements .Add(newExperienceRequirement(3)));});
此外範圍,還需要在 IAuthorizationHandler 類型的范圍內(nèi)向 DI 系統(tǒng)注冊新的處理程序:
services.AddSingleton c.Type == "EditorSince")) returnTask.CompletedTask; varsince = user.FindFirst("EditorSince").Value.ToInt(); if(since >= requirement.Years) context.Succeed(requirement); returnTask.CompletedTask; }}
示例授權(quán)處理程序讀取與用戶關(guān)聯(lián)的聲明求得平衡,并檢查自定義 EditorSince 聲明。如果找不到空間廣闊,處理程序便無法返回成功至關重要。只有在找到聲明且包含的整數(shù)值不低于指定年數(shù)時,才能返回成功服務品質。
自定義聲明應為一條信息的發生,以某種方式與保存到身份驗證 Cookie 中的用戶相關(guān)聯(lián)(例如,“用戶”表中的列)影響。
不過新的動力,一旦保留對用戶的引用的過程中,便始終可以從聲明中找到用戶名ASPCMS批量更新文章,并對任何數(shù)據(jù)庫或外部服務運行查詢廣泛認同,以獲取經(jīng)驗年數(shù)國際要求,從而在處理程序中使用此信息。(我承認鍛造,如果 EditorSince 值保留 DateTime,并計算用戶擔任編輯者是否已有一定年數(shù)具體而言,此示例會更真實一點工具。)
授權(quán)處理程序調(diào)用方法 Succeed,同時傳遞當前要求喜愛,以通知此要求已成功得到驗證重要的角色。如果沒有傳遞要求,處理程序無需執(zhí)行任何操作向好態勢,可以直接返回內(nèi)容平臺建設。不過,如果處理程序要確定是否不符合要求(無論其他處理程序是否已成功驗證同一要求)貢獻力量,將會對授權(quán)上下文對象調(diào)用方法 Fail使用。
下面展示了如何將自定義要求添加到策略(請注意,由于這是自定義要求發行速度,因此沒有擴展方法更加堅強,而必須繼續(xù)處理策略對象的整個 Requirements 集合):
services.AddAuthorization(options =>{ options.AddPolicy("AtLeast3Years", policy => policy .Requirements .Add(newExperienceRequirement(3)));});
此外,還需要在 IAuthorizationHandler 類型的范圍內(nèi)向 DI 系統(tǒng)注冊新的處理程序:
services.AddSingleton= requirement.Years) context.Succeed(requirement); returnTask.CompletedTask; }}
示例授權(quán)處理程序讀取與用戶關(guān)聯(lián)的聲明性能,并檢查自定義 EditorSince 聲明初步建立。如果找不到,處理程序便無法返回成功供給。只有在找到聲明且包含的整數(shù)值不低于指定年數(shù)時的方法,才能返回成功。
自定義聲明應為一條信息進行探討,以某種方式與保存到身份驗證 Cookie 中的用戶相關(guān)聯(lián)(例如落到實處,“用戶”表中的列)。
不過再獲,一旦保留對用戶的引用產品和服務,便始終可以從聲明中找到用戶名,并對任何數(shù)據(jù)庫或外部服務運行查詢體驗區,以獲取經(jīng)驗年數(shù)增多,從而在處理程序中使用此信息。(我承認有望,如果 EditorSince 值保留 DateTime進一步推進,并計算用戶擔任編輯者是否已有一定年數(shù)導向作用,此示例會更真實一點。)
授權(quán)處理程序調(diào)用方法 Succeed應用的選擇,同時傳遞當前要求真正做到,以通知此要求已成功得到驗證。如果沒有傳遞要求創新延展,處理程序無需執(zhí)行任何操作強化意識,可以直接返回內(nèi)容。不過基本情況,如果處理程序要確定是否不符合要求(無論其他處理程序是否已成功驗證同一要求)現場,將會對授權(quán)上下文對象調(diào)用方法 Fail。
下面展示了如何將自定義要求添加到策略(請注意力量,由于這是自定義要求我有所應,因此沒有擴展方法,而必須繼續(xù)處理策略對象的整個 Requirements 集合):
services.AddAuthorization(options =>{ options.AddPolicy("AtLeast3Years", policy => policy .Requirements .Add(newExperienceRequirement(3)));});
此外深入實施,還需要在 IAuthorizationHandler 類型的范圍內(nèi)向 DI 系統(tǒng)注冊新的處理程序:
ASPCMS批量添加欄目services.AddSingleton{ options.AddPolicy("AtLeast3Years", policy => policy .Requirements .Add(newExperienceRequirement(3)));});
此外機構,還需要在 IAuthorizationHandler 類型的范圍內(nèi)向 DI 系統(tǒng)注冊新的處理程序:
services.AddSingleton policy .Requirements .Add(newExperienceRequirement(3)));});
此外與時俱進,還需要在 IAuthorizationHandler 類型的范圍內(nèi)向 DI 系統(tǒng)注冊新的處理程序:
services.AddSingleton();
如前所述上高質量,要求可包含多個處理程序蓬勃發展。如果為授權(quán)層的同一要求向 DI 系統(tǒng)注冊多個處理程序,有一個成功就足夠了快速融入。
訪問當前 HttpContext
在實現(xiàn)授權(quán)處理程序的過程中認為,可能需要檢查請求屬性或路由數(shù)據(jù),如下所示:
if(context.Resource isAuthorizationFilterContext mvc){ varurl = mvc.HttpContext.Request.GetDisplayUrl(); ...}
在 ASP.NET Core 中增強,AuthorizationHandlerContext 對象向 FilterContext 對象公開 Resource 屬性集重要意義。上下文對象因所涉及的框架而異。例如更加廣闊,MVC 和 SignalR 發(fā)送自己的特定對象規劃。是否發(fā)生轉(zhuǎn)換視需要訪問的內(nèi)容而定。例如可以使用,用戶信息始終可用進入當下,所以無需為此進行轉(zhuǎn)換;但若要獲取 MVC 專屬詳細信息(如路由信息)效高化,則需要進行轉(zhuǎn)換新體系。
總結(jié)
在 ASP.NET Core 中,授權(quán)分為兩種創造。一種是基于角色的傳統(tǒng)授權(quán)不難發現,它的工作原理與在經(jīng)典 ASP.NET MVC 中的工作原理相同,但仍存在相當平面化的結(jié)構(gòu)限制環境,不適合表達復雜的授權(quán)邏輯空間載體。
基于策略的身份驗證是一種新方法高質量,可提供更豐富、更易表達的模型重要組成部分。這是因為流程,策略包含一系列基于聲明的要求,以及基于可從 HTTP 上下文或外部源注入的其他任何信息的自定義邏輯勃勃生機。這些要求各自與一個或多個處理程序相關(guān)聯(lián)助力各業,這些處理程序負責要求的實際計算。
Dino Esposito是《Microsoft .NET:構(gòu)建面向企業(yè)的應用程序》(Microsoft Press提供有力支撐,2014 年)和《使用 ASP.NET 構(gòu)建新型 Web 應用程序》(Microsoft Press深入交流,2016 年)的作者。作為 JetBrains 的 .NET 和 Android 平臺的技術(shù)推廣人員加強宣傳,Esposito 經(jīng)常在全球行業(yè)活動中發(fā)表演講,并在 software2cents@wordpress.com 上以及 Twitter @despos 上的推文中分享他對于軟件的愿景用的舒心。
文章地址:http://www.61py.com/article/other/clsjsyxjswnrbjzhgjyhdyh.html