教你实践ASP.NET Core Authorization(免看文档教程)
準備
創建一個名為AuthorizationForoNetCore的(web)解決方案,選擇Empty模板
添加相關nuget包引用Microsoft.AspNetCore.Mvc(選擇最新版本)
編輯Startup.cs文件,添加mvcservice并進行默認路由配置
?
添加Controllers文件夾,添加HomeContrller?
?
創建Views/Home文件夾,并添加Index(Action)對應的Index.cshtml文件
| <!--Index.cshtml--> 假如生活欺騙了你 假如生活欺騙了你, 不要悲傷,不要心急! 憂郁的日子里須要鎮靜: 相信吧,快樂的日子將會來臨! ? |
?使用Authorization
添加相關nuget包(均使用最新版本)
Microsoft.AspNetCore.Authorization
Microsoft.AspNetCore.Authentication.Cookies
在ConfigureServices()方法中添加對應服務:??services.AddAuthorization()
在Index(Action)方法上添加?[Authorize]?特性,毫無疑問,添加后執行dotnet run?指令后后會返回401的授權碼,那么接著操作
編輯Startup.cs在Configureapp.UseMvc()方法之前,我們添加一個cookie 中間件,用于持久化請求管道中的身份配置信息
tip:相關配置參數細節請參閱:https://docs.asp.net/en/latest/security/authentication/cookie.html
添加Controllers/Account文件夾,添加?AccountController.cs?控制器文件,實現上述指定的方法,可能這里你會疑惑,為什么文檔里不是一個?/Account/Login?這類的,文檔說了別較真,這就是個例子而已,繼續你就明白了。
添加并實現上述中間件重定向的action 方法如下,你可以看到其實Unauthorized方法模擬實現了登陸的過程。tip:假如你添加Unauthorized視圖,并且沒有該不實現模擬登陸,那么運行你會直接看到?Unauthorized.cshtml?的內容,這里我們不需要添加該視圖,僅作說明。
編輯?Home/Index.schtml
運行代碼你會看到如下結果(程序獲取我們提供的由issuer發布claims并展示在視圖中,后續會檢查Claims看他們是否匹配)
使用全局授權策略
去除Home/Index (Action)上的??[Authorize]??特性
添加?Views/Account/Forbidden.cshtml?頁面,內容為?<h1>拒絕訪問</h1>?
修改?ConfigureServices?方法中的?services.AddMvc()?使用它的?AddMvc(this IServiceCollection services, Action<MvcOptions> setupAction)?重載
運行查看結果,你會發現這幾乎成了一個無限的重定向從而造成錯誤,因為每個頁面都需要授權。
為?AccountController?添加?[AllowAnonymous]?特性,啟動匿名訪問,再次運行項目,查看結果
結果就是重定向到了?Forbidden.cshtml?頁面
使用角色授權
在?HomeController?上添加?[Authorize(Roles = "Administrator")]?特性
在模擬登陸處(?Unauthorized方法中?)添加角色說明的身份信息條目:
? claims.Add(new Claim(ClaimTypes.Role, "Administrator", ClaimValueTypes.String, "https://www.cnblogs.com/rohelm"));
運行項目查看結果
可以使用中你會發現Asp.net Core安全驗證方面較以往的版本最大的改變就是全部采用中間件的方式進行驗證授權,并很好的使用了Policy?(策略)這個概念,下那么繼續~。
基于聲明的授權
返回Startup.cs,修改?services.AddAuthorization()?方法如下:
services.AddAuthorization(options => {options.AddPolicy("EmployeeOnly", policy => policy.RequireClaim("EmployeeNumber")); });修改HomeController上的特性,添加?[Authorize(Policy = "EmployeeOnly")]?
運行項目查看結果,發現被拒絕了
在模擬登陸處?Unauthorize方法添加:
goto 3.
多重策略的應用,與之前的版本幾乎一樣,例如本次修改的結果可以為:
詳情請參閱:https://docs.asp.net/en/latest/security/authorization/claims.html的說明
?自定義授權策略?
自定義授權策略的實現,包括實現一個?IAuthorizationRequirement?的Requirement,和實現?AuthorizationHandler<TRequirement>?的處理器,這里使用文檔
https://docs.asp.net/en/latest/security/authorization/policies.html中的Code。
添加?MinimumAgeHandler?處理器實現
在?AddAuthorization ?中添加一個名為Over21的策略
options.AddPolicy("Over21", policy => policy.Requirements.Add(new MinimumAgeRequirement(21)));在HomeController上應用該策略? [Authorize(Policy = "Over21")]?
在?Unauthorized?函數中添加對應的聲明信息條目?claims.Add(new Claim(ClaimTypes.DateOfBirth, "1900-01-01", ClaimValueTypes.Date));
修改時間(例如小于21歲的生日,2000-01-01)并運行調試,查看結果
對一個Requirement應用多個處理器
tip:上面的演示,我們使用了一個同時實現AuthorizationHandler<MinimumAgeRequirement>, IAuthorizationRequirement的MinimumAgeRequirement來做演示,但是如果一個Requirement徐要實現多個處理器就需要分開寫了,原因很簡單,這里無法實現類的多重繼承。
下面我們實現一個使用Token登陸的需求
?添加一個LoginRequirement的需求
public class LoginRequirement: IAuthorizationRequirement{}添加一個使用用戶名密碼登陸的處理器
在一些場景中我們也會使用發放訪問令牌的方式讓用戶登陸
在?AddAuthorization??中添加一個名為CanLogin的策略
options.AddPolicy("CanLogin", policy => policy.Requirements.Add(new LoginRequirement()));注冊自定義策略
services.AddSingleton<IAuthorizationHandler, HasPasswordHandler>();services.AddSingleton<IAuthorizationHandler, HasAccessTokenHandler>();在Unauthorized 函數中添加對應的聲明信息條目
claims.Add(new Claim("UsernameAndPassword", "123456", ClaimValueTypes.String, "http://www.cnblogs.com/rohelm"));// 測試切換登陸聲明方式
//?claims.Add(new Claim("AccessToken", DateTime.Now.AddMinutes(1).ToString(), ClaimValueTypes.String, "http://www.cnblogs.com/rohelm"));
在HomeController上應用該策略??[Authorize(Policy = "CanLogin")] ?
運行并查看結果。
基于資源的Requirements
在實際開發者中,除了基于用戶的授權驗證外,通過我們也會遇到針對一些資源的授權限制,例如有的人可以編輯文檔,有的人只能查看文檔,由此引出該話題
https://docs.asp.net/en/latest/security/authorization/resourcebased.html
?定義一個Document類
public class Document{ public int Id { get; set; }public string Author { get; set; }}
定義Document倉儲接口
模擬實現上述接口
注冊接口實現類
services.AddSingleton<IDocumentRepository, FakeDocumentRepository>();創建一個?DocumentController?并修改為如下內容
添加對應?Index.cshtml? 視圖文件
添加對應的?Edit.cshtml?視圖文件
@model AuthorizationForoNetCore.Modles.Document<h1>文檔 #@Model.Id</h1> <h2>作者: @Model.Author</h2>定義EditRequirement
public class EditRequirement : IAuthorizationRequirement{}添加對應的編輯文檔處理器
在?ConfigureServices()?方法中注冊處理器實現
1 services.AddSingleton<IAuthorizationHandler, DocumentEditHandler>();由于對于文檔的授權服務僅僅反正在操作方法的內部,因此我們需要直接注入?IAuthorizationService?對象并在需要的Action內部直接處理
運行查看結果
在視圖中進行授權
問題來了額,上面示例的視圖中怎么做限制了,那就繼續了
1.使用??@inject?命令注入?AuthorizationService ?
2.應用該上述同樣策略,做簡單修改
?請在運行時清理Cookie,或者在試驗時直接暫時禁用
之前寫的一個插件,誰有時間幫升級支持下asp.net Core:https://github.com/halower/JqGridForMvc
相關文章:
ASP.NET Core 1.0 入門——了解一個空項目
ASP.NET Core 1.0 部署 HTTPS (.NET Framework 4.5.1)
.NET Core 1.0、ASP.NET Core 1.0和EF Core 1.0簡介
云服務器下ASP.NET Core 1.0環境搭建(包含mono與coreclr)
使用VS Code開發ASP.NET Core 應用程序
dotnet run是如何啟動asp.net core站點的
ASP.NET Core提供模塊化Middleware組件
“dotnet restore"和"dotnet run"都做了些什么?
探秘 dotnet run 如何運行 .NET Core 應用程序
.NET Portability Analyzer 已開源
ASP.NET Core的配置(1):讀取配置信息
ASP.NET Core的配置(2):配置模型詳解
.NET Core 1.0 RC2 歷險之旅
使用VS Code開發 調試.NET Core 應用程序
讓我們Core在一起:ASP.NET Core & .NET Core
.NET Core VS Code 環境配置
官方博客明確了 .NET Core RC2/RTM 時間表
.NET Core全新的配置管理[共9篇]
利用記事本創建一個ASP.NET Core RC2 MVC應用
微軟.NET 正式劈腿成功,橫跨所有平臺
.NET Core 1.0 CentOS7 嘗試
解讀發布:.NET Core RC2 and .NET Core SDK Preview 1
[.NET Core].NET Core R2安裝及示例教程
ASP.NET Core 開發-中間件(Middleware)
結合Jexus + Kestrel 部署 asp.net core 生產環境
通過Jexus 部署 dotnetcore版本MusicStore 示例程序
ASP.NET Core 中文文檔 第一章 入門
用 Visual Studio Code 在 macOS 上創建首個 ASP.NET Core 應用程序
用 Visual Studio 和 ASP.NET Core MVC 創建首個 Web API
用 Visual Studio 發布一個 Azure 云 Web 應用程序
ASP.NET Core MVC 與 Visual Studio 入門
第二章指南(4.2)添加 Controller
DotNet Core 介紹
第二章 指南(4.3)添加 View
asp.net core 中間件詳解及項目實戰
原文地址:http://www.cnblogs.com/rohelm/p/Authorization.html
.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注
總結
以上是生活随笔為你收集整理的教你实践ASP.NET Core Authorization(免看文档教程)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RAML用户应遵循的C#与Web API
- 下一篇: JFlow CCFlow工作流引擎北京培